1、数据持久化
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 PreferenceManager.getDefaultSharedPreferences(Context context):SharedPreferences | 使用键值对的方式来存储数据,保存数据更加方便。数据以明文的方式保存在文件中,需要加密 |
数据库 | /data/data/<packagename>/databases/ | SqLiteOpenHelper类、SQLiteDatabase类 | 可以保存大量复杂的关系型数据 |
2、文件存储
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、SharedPreferences
3.1 三种不同的实现方式对比
在这个程序中,对应的包名为:
三种不同的实现方式对比
实现方式 | 方法解析 | 保存的文件名 |
Context.getSharedPreferences(String name, int mode):SharedPreferences | name: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方法,根据数据类型来决定。
4、数据库
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表示二进制类型。