zoukankan      html  css  js  c++  java
  • Android笔记:数据储存

    1、文件存储

      文件存储是Android 中最基本的一种数据存储方式,它不对存储的内容进行任何的格式化处理,所有数据都是原封不动地保存到文件当中的,因而它比较适合用于存储一些简单的文本数据或二进制数据。

      Context 类中提供了一个openFileOutput ()方法,可以用于将数据存储到指定的文件中。

      openFileOutput ()方法返回的是一个FileOutputStream 对象,得到了这个对象之后就可以使用Java 流的方式将数据写入到文件中了。

      第一个参数是文件名,第二个参数是文件的操作模式, 主要有两种模式可选,MODE_PRIVATE(覆盖)和MODE_APPEND(追加)。

      储存:

        通过openFileOutput() 方法能够得到一个FileOutputStream 对象, 然后再借助它构建出一个OutputStreamWriter 对象,

        接着再使用OutputStreamWriter 构建出一个BufferedWriter 对象,就可以通过BufferedWriter 来将文本内容写入到文件中了。

      读取:

        通过openFileInput()方法获取到了一个FileInputStream 对象,然后借助它又构建出了一个InputStreamReader 对象,

        接着再使用InputStreamReader 构建出一个BufferedReader 对象,这样我们就可以通过BufferedReader 进行一行行地读取,

        把文件中所有的文本内容全部读取出来并存放在一个StringBuilder 对象中,最后将读取到的内容返回

        

    public class FileTestActivity extends Activity {
         
        final String FILE = "jason.bin";
         
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
             
            Button read = (Button) findViewById(R.id.read);
            Button write = (Button) findViewById(R.id.write);
             
            final EditText edit1 = (EditText) findViewById(R.id.edit1);
            final EditText edit2 = (EditText) findViewById(R.id.edit2);
             
             
            write.setOnClickListener(new OnClickListener() {
                 
                @Override
                public void onClick(View v) {
                    write(edit1.getText().toString());
                    edit1.setText("");
                }
            });
             
            read.setOnClickListener(new OnClickListener() {
                 
                @Override
                public void onClick(View v) {
                    edit2.setText(read());
                }
            });
        }
         
         
        private String read() {
            try {
                FileInputStream fis = openFileInput(FILE);
                byte[] buffer = new byte[1024];
                int hasRead = 0;
                StringBuilder sb = new StringBuilder("");
                while ((hasRead = fis.read(buffer)) > 0) {
                    sb.append(new String(buffer, 0, hasRead));
                }
                return sb.toString();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
         
        private void write(String content)
        {
            try
            {
                // 以追加模式打开文件输出流
                FileOutputStream fos = openFileOutput(FILE, MODE_APPEND);
                // 将FileOutputStream包装成PrintStream
                PrintStream ps = new PrintStream(fos);
                // 输出文件内容
                ps.println(content);
                ps.close();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }
    View Code

    2、SharedPreference 存储

      要想使用SharedPreferences来存储数据,首先需要获取到SharedPreferences对象。Android中主要提供了三种方法用于得到SharedPreferences 对象。

      1. Context 类中的getSharedPreferences()方法
        此方法接收两个参数,第一个参数用于指定SharedPreferences 文件的名称,如果指定的文件不存在则会创建一个,

        第二个参数用于指定操作模式,主要有两种模式可以选择,MODE_PRIVATE 和MODE_MULTI_PROCESS。

      2. Activity 类中的getPreferences()方法
        这个方法和Context 中的getSharedPreferences()方法很相似,不过它只接收一个操作模式参数,因为使用这个方法时会自动将当前活动的类名作为SharedPreferences 的文件名。

      3. PreferenceManager 类中的getDefaultSharedPreferences()方法
        这是一个静态方法,它接收一个Context 参数,并自动使用当前应用程序的包名作为前缀来命名SharedPreferences 文件。得到了SharedPreferences 对象之后,

        就可以开始向SharedPreferences 文件中存储数据了,主要可以分为三步实现。
          1. 调用SharedPreferences 对象的edit()方法来获取一个SharedPreferences.Editor 对象。
          2. 向SharedPreferences.Editor 对象中添加数据,比如添加一个布尔型数据就使用putBoolean 方法,添加一个字符串则使用putString()方法,以此类推。
          3. 调用commit()方法将添加的数据提交,从而完成数据存储操作。

        读取:

          通过getSharedPreferences()方法得到SharedPreferences 对象,然后分别调用它的getString()、getInt()和getBoolean()方法去获取前面所存储的内容。

    3、数据库存储

      数据库升级:

        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
          db.execSQL("drop table if exists Book");
          db.execSQL("drop table if exists Category");
          onCreate(db);
        }

      增:insert()方法

        第一个参数是表名。第二个参数用于在未指定添加数据的情况下给某些可为空的列自动赋值NULL。第三个参数是一个ContentValues 对象,

        它提供了一系列的put()方法重载,用于向ContentValues 中添加数据,只需要将表中的每个列名以及相应的待添加数据传入即可。

        SQLiteDatabase db = dbHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("name", "The Da Vinci Code");
        values.put("author", "Dan Brown");
        values.put("pages", 454);
        values.put("price", 16.96);
        db.insert("Book", null, values);

      改:update()方法

        第一个参数是表名。第二个参数是ContentValues 对象,要把更新数据在这里组装进去。第三、第四个参数用于去约束更新某一行或某几行中的数据,不指定的话默认就是更新所有行。

        SQLiteDatabase db = dbHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("price", 10.99);
        db.update("Book", values, "name = ?", new String[] { "The DaVinci Code" });

      删:delete()方法

        第一个参数是表名。第二、第三个参数又是用于去约束删除某一行或某几行的数据,不指定的话默认就是删除所有行。

        SQLiteDatabase db = dbHelper.getWritableDatabase();
        db.delete("Book", "pages > ?", new String[] { "500" });

      查:query()方法

        第一个参数是表名。第二个参数用于指定去查询哪几列,如果不指定则默认查询所有列。第三、第四个参数用于去约束查询某一行或某几行的数据,不指定则默认是查询所有行的数据。

        第五个参数用于指定需要去group by 的列,不指定则表示不对查询结果进行group by 操作。第六个参数用于对group by 之后的数据进行进一步的过滤,不指定则表示不进行过滤。

        第七个参数用于指定查询结果的排序方式,不指定则表示使用默认的排序方式。

        public void onClick(View v) {
          SQLiteDatabase db = dbHelper.getWritableDatabase();// 查询Book表中所有的数据
          Cursor cursor = db.query("Book", null, null, null, null, null, null);
          if (cursor.moveToFirst()) {
          do {// 遍历Cursor对象,取出数据并打印
            String name = cursor.getString(cursor.getColumnIndex("name"));
            String author = cursor.getString(cursor.getColumnIndex("author"));
            int pages = cursor.getInt(cursor.getColumnIndex("pages"));
            double price = cursor.getDouble(cursor.getColumnIndex("price"));
              Log.d("MainActivity", "book name is " + name);
              Log.d("MainActivity", "book author is " + author);
              Log.d("MainActivity", "book pages is " + pages);
              Log.d("MainActivity", "book price is " + price);
            } while (cursor.moveToNext());
          }
          cursor.close();
          }
        });

    4、存储在SD卡

      要加权限:

        <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> 

        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

      获取SD卡路径:Environment.getExternalStorageDirectory();

      判断SDcard是否存在并且可读写:
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
           service.saveToSDCard(filename,filecontent);
           Toast.makeText(getApplicationContext(), R.string.success, 1).show();
          }else{
           Toast.makeText(getApplicationContext(), R.string.sdcarderror, 1).show();
          }

        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
             
            Button read = (Button) findViewById(R.id.read);
            Button write = (Button) findViewById(R.id.write);
            // 获取两个文本框
            final EditText edit1 = (EditText) findViewById(R.id.edit1);
            final EditText edit2 = (EditText) findViewById(R.id.edit2);
            // 为write按钮绑定事件监听器
            write.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View source) {
                    // 将edit1中的内容写入文件中
                    write(edit1.getText().toString());
                    edit1.setText("");
                }
            });
             
            read.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 读取指定文件中的内容,并显示出来
                    edit2.setText(read());
                }
            });
        }
         
        private String read() {
            // 如果手机插入了SD卡,而且应用程序具有访问SD的权限
             
            try {
                if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                    // 获取SD卡的目录
                    File sdDirFile = Environment.getExternalStorageDirectory();
                    //获取指定文件对应的输入流
                    FileInputStream fis = new FileInputStream(sdDirFile.getCanonicalPath()+ FILE);
                    //将指定输入流包装成BufferedReader
                    BufferedReader br = new BufferedReader(new InputStreamReader(fis));
                     
                    StringBuilder sb = new StringBuilder("");
                    String line = null;
                    while ((line =br.readLine())!=null) {
                        sb.append(line);
                    }
                    return sb.toString();
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
     
        private void write(String context){
            try {
                if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
                    File sdDir = Environment.getExternalStorageDirectory();
                    File targetFile = new File(sdDir.getCanonicalPath()+ FILE);
                    RandomAccessFile raf = new RandomAccessFile(targetFile, "rw");
                    raf.seek(targetFile.length());
                    raf.write(context.getBytes());
                    raf.close();
                }
            } catch (Exception e) {
            }
        }
    }
    View Code
  • 相关阅读:
    ThinkPHP第八天(U函数放置在外部JS不会被解析,错误界面定制,错误信息变量)
    ThinkPHP第七天(F函数使用,项目分组配置,项目分组模板文件放置规则配置)
    thinkphp第二天
    ThinkPHP第五天(提交类型判定常量IS_POST等,错误页面种类,Model实例化方式,模板中使用函数,foreach循环,模板中.语法配置)
    高阶函数、函数嵌套和闭包
    递 归
    函数式编程
    命名空间
    函数的参数
    循环语句
  • 原文地址:https://www.cnblogs.com/lxwy1992/p/4742923.html
Copyright © 2011-2022 走看看