1.1 定义
数据持久化就是将内存中的瞬时数据保存到存储设备中,保证即使在手机或者是电脑关机的情况下,数据也不会丢失。
1.2 方式
在android中数据持久化分为三种:文件存储、SharedPreferences存储和数据库存储。
1.3 三种方式对比
数据持久化三种方式对比
方式保存路径涉及到的类特点文件存储/data/data/<packagename>/files///从文件中读取数据
Context.openFileInput(String fileName):FileInputStream
//将数据存储到文件中
Context.openFileOutput(String fileName, int mode):FileOutputStream 不对存储的内容进行任何的格式化处理,比较合适存储一些简单的文本数据或二进制数据SharedPreferences存储/data/data/<packagename>
/shared_prefs/Context.getSharedPreferences(String name, int mode):SharedPreferences
Activity.getPreferences(int mode):SharedPreferences
2.1 存储数据
调用的方法:Context.openFileOutput(String fileName, int mode):FileOutputStream
其中,mode的值有两个,分别为:Context.MODE_PRIVATE和Context.MODE_APPEND
Context.MODE_PRIVATE:为默认模式,表示当指定相同文件名的时候,会覆盖原有文件。
Context.MODE_APPEND:表示文件已经存在时,会将内容追加到之前的文件中。
下面是一个例子:
/** * 保存数据 * @param view */ public void saveData(View view){ String text = inputText.getText().toString(); if(!TextUtils.isEmpty(text)){ FileOutputStream fileOutputStream = null; BufferedWriter fileWriter = null; try{// fileOutputStream = FilePersistenceActivity.this.openFileOutput(FILENAME, Context.MODE_PRIVATE);//每次文件都是会被覆盖掉 fileOutputStream = FilePersistenceActivity.this.openFileOutput(FILENAME, Context.MODE_APPEND);//在原有文件的基础之上追加内容 fileWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream)); fileWriter.write(text); fileWriter.write("\r\n"); }catch (FileNotFoundException e){ Log.e(TAG, "saveData: 文件不存在"); }catch (IOException e){ Log.e(TAG, "saveData: IOException"+e.getMessage() ); }finally { try { if (null != fileWriter) { fileWriter.close(); } }catch (IOException e){ Log.e(TAG, "finally: IOException"+e.getMessage() ); } inputText.setText(""); } } }
2.2 读取数据
从文件中读取数据Context.openFileInput(String fileName):FileInputStream
示例代码:
/** * 读取数据 * @param view */ public void readData(View view){ FileInputStream fileInputStream = null; BufferedReader bufferedReader = null; try { fileInputStream = FilePersistenceActivity.this.openFileInput(FILENAME); bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream)); String readLine = null; StringBuffer stringBuffer = new StringBuffer(); while (!TextUtils.isEmpty(readLine = bufferedReader.readLine())){ stringBuffer.append("\r\n"); stringBuffer.append(readLine); } inputtedText.setText(stringBuffer.toString()); }catch (FileNotFoundException e){ Log.e(TAG, "readData:" +e.getMessage()); }catch (IOException e){ Log.e(TAG, "IOException:" +e.getMessage()); }finally { try { if(null != bufferedReader){ bufferedReader.close(); } }catch (IOException e){ Log.e(TAG, "IOException:" +e.getMessage()); } } }
3.1 三种不同的实现方式对比
在这个程序中,对应的包名为:
三种不同的实现方式对比
实现方式方法解析保存的文件名
Context.getSharedPreferences(String name, int mode)
:SharedPreferencesname:SharedPreferences文件的名称.
mode:目前只有MODE_PRIVATE这一种模式,是默认操作,表示只有当前的程序才可以对此SharedPreference进行操作
name所定义的名字
Activity.getPreferences(int mode):SharedPreferences 当前活动的类名作为文件名
PreferenceManager.getDefaultSharedPreferences(Context context):SharedPreferences 当前应用程序包名作为前缀
3.2 保存数据
调用SharedPreferences.Editor类,使用putXXX()方法,然后调用SharedPreferences.Editor的apply()即可。具体使用哪一个put方法,根据数据类型来决定。
3.3 读取数据
直接调用SharedPreferences类的getXXX()方法。具体调用哪一个get方法,根据数据类型来决定。
Android主要使用Sqlite数据库作为系统默认数据库。
4.1 主要涉及到的类
主要涉及到SQLiteOpenHelper和SQLiteDatabase这两个类。SQLiteOpenHelper是一个接口,主要负责数据库的创建和升级。SQLiteDatabase类主要负责执行对应的sql语句。
SQLiteOpenHelper接口有onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)这两个方法需要重写,onCreate方法在数据库初次被创建时调用。onUpgrade方法,在传入的newVersion参数发生改变的时候,进行调用。newVersion参数,在SQLiteOpenHelper的构造方法中传入。
其中SQLiteDatabase可以通过SQLiteOpenHelper类的getWritableDatabase()和getReadableDatabase()这两个方法获得。当数据库不可以写入的时候,调用getWritableDatabase()会出现异常。调用这两个方法的过程中,会创建或者打开已有的数据库文件。
4.2 执行增删改查所对应的方法
对于数据库的增加、修改、和删除操作都可以直接调用execSQL方法,但是查询就需要调用rawQuery方法。
具体事例如下:
sqLiteDatabase.exeSql("delete from book where name = ?",new String[]{"java"});sqLiteDatabase.exeSql("update book set price = ? where name = ?",new String[]{"123","java"});sqLiteDatabase.exeSql("insert into book(name,author,price)values(?,?,?);",new String[]{"java","cxy","23.56"});Cursor cursor = sqLiteDatabase.rawQuery("select * from book",null);
4.3 数据库中主要的数据类型
integer表示整形,real表示浮点型,text表示文本类型,blob表示二进制类型。