数据持久化就是将内存中瞬时数据保存到存储设备中。
Android中主要提供了3种方式用于实现数据持久化,包括文件存储、SharedPreferences存储和数据库存储。
一.文件存储
文件存储比较适合用于存储一些简单的文本数据或二进制数据。
1.将数据存储到文件中
public void save(){
String data = "Data to save";
FileOutputStream out = null;
BufferedWriter writer = null;
try {
out = openFileOutput("data", Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(data);
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
try {
if(writer != null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Context类中提供了一个openFileOutput()方法,用于将数据存储到指定的文件中。接收两个参数,第一个参数是文件名,所有的文件都是默认存储到/data/data/<packagename>/files/目录下。第二个是文件的操作模式,MODE_PRIVATE表示指定同样的文件名的时候,所写入的内容会覆盖原来文件中的内容,MODE_APPEND表示如果该文件已存在,就往文件里追加内容,不存在则创建新文件。
通过openFileOutput()方法得到一个FileOutputStream对象,然后再借助它构造出一个OutputStreamWriter对象,接着用OutputStreamWriter构造出一个BufferedWriter对象,通过BufferedWriter将文本写入文件。
2.从文件中读取数据 public String load(){
FileInputStream in = null;
BufferedReader reader = null;
StringBuilder content = new StringBuilder();
try {
in = openFileInput("data");
reader = new BufferedReader(new InputStreamReader(in));
String line = "";
while((line = reader.readLine()) != null){
content.append(line);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
if(reader != null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return content.toString();
}
Context类中海提供了一个OpenFileInput()方法用于从文件中读取数据,只接受一个参数,即文件名,系统自动从/data/data/<package name>/files/去加载这个文件。
openFileInput()方法获取到了一个FileInputStream对象,借助它构建出一个InputStreamReader对象,接着借助InputStreamReader构建出一个BufferedReader对象,通过BufferedReader一行行地读取,把文本中的所有文本内容全部读取出来。
二.SharedPreferences存储
SharedPreferences使用键值对来存数据。
将数据存储到SharedPreferences中,首先要获取SharedPreferences对象,有3种方式。
1.Context类中的getSharedPreferences()方法
接受两个参数,第一个用于指定SharedPreferences文件的名称,如果文件不存在则创建一个。SharedPreferences文件都是存放在/data/data/<package name>/shared_prefs/目录下。第二个参数用于指定操作模式MODE_PRIVATE,表示只有当前的应用程序才可以对这个SharedPreferences文件进行读写。
2.Activity类中的getPreferences()方法
只接受一个参数即操作模式MODE_PRIVATE,使用此方法会自动将当前Activity的类名作为SharedPreferences的文件名。
3.PreferenceManager类中的getDefaultSharedPreferences()方法
只接受一个参数即Context,自动使用当前程序的包名作为前缀来命名SharedPreferences文件。
得到SharedPreferences对象后,通过以下3步进行存储数据。
a.调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象。
b.向SharedPreferences.Editor对象中添加数据,putXXX(key,value);
c.调用apply()方法提交。
SharedPreferences.Editoreditor=getSharedPreferences("data", MODE_PRIVATE).edit();
editor.putString("name", "Tom");
editor.putInt("age", 28);
editor.putBoolean("married", false);
editor.apply();
从SharePreferences中取数据
SharedPreferences pref = getSharedPreferences("data",MODE_PRIVATE);
String name = pref.getString("name", "");
int age = pref.getInt("age", 0);
boolean married = pref.getBoolean("married", false);
第二个参数是默认值,当传入的键找不到对应的值时返回的值。
三,.数据库存储
Android中的SQLite是一种轻量级的关系型数据库,运算速度快,占用的内存小,适合在移动设备上使用。
1.创建和升级数据库
Android中提供了SQLiteOpenHelper类来让我们更加方便地管理数据库,通过SQLiteOpenHelper类可以来创建和升级数据库。
SQLiteOpenHelper是一个抽象类,有两个抽象方法分别是onCreate()和onUpgrade(),我们可以继承这个抽象类得到自己的Helper类并重写这两个方法。
onCreate()会在第一次创建数据库的时候调用,可以执行创建表,初始化数据等操作。
onUpgrade()会在当前数据库的版本号与打开数据库时传入的版本号不一致时调用,可以执行更改数据库表结构等操作。
public class MyDataBaseHelper extends SQLiteOpenHelper {
public static final String CREATE_BOOK = "create table book ("
+"id integer primary key autoincrement,"
+"author text,"
+"price real,"
+"name text)";
public static final String CREATE_CATEGORY = "create table Category( "
+ "id integer primary key autoincrement, "
+ "category_name text, "
+ "category_code integer)";
private Context context;
public MyDataBaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
this.context = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(CREATE_CATEGORY);
}
}
构造函数MyDataBaseHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version)第二个参数表示数据库的名字,第三个参数允许我们在查询数据的时候返回一个自定义的Cursor,一般传入null, 第四个参数表示当前数据库的版本号。
然后我们可以通过SQLiteOpenHelper中的两个方法创建或者打开一个现有的数据库,getReadableDatabase()和getWritableDatabase(),这两个方法都会返回一个可数据库进行读写的SQLiteDatabase实例(getReadableDatabase()也会调用getWritableDatabase()),区别是,当数据库不可写入(磁盘已满),getReadableDatabase()返回的是只能对数据库进行读的实例,而getWritableDatabase()则会出现异常。
MyDataBaseHelper myDataBaseHelper = new MyDataBaseHelper(this,"BookStore.db",null,1);
myDataBaseHelper.getWritableDatabase();
myDataBaseHelper.getReadableDatabase();
2.CRUD操作
a.Create添加
SQLiteDatabase sqLiteDatabase = myDataBaseHelper.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("author","liaowh");
sqLiteDatabase.insert("book",null,contentValues);
contentValues.clear();
insert()方法传入三个参数,第一个参数是表名,第二个参数是指在未指定添加参数的情况下给某些可为空的列自动赋值NULL,第三个参数是一个ContentValues对象。
使用SQL语句:
sqLiteDatabase.execSQL("insert into Book (author) values(?)", new String[] { "liaowah" });
b.Retrieve查询
SQLiteDatabase sqLiteDatabase = myDataBaseHelper.getWritableDatabase();
Cursor c = sqLiteDatabase.query("book",null,null,null,null,null,null);
if(c.moveToFirst())
{
do{
String id = c.getString(c.getColumnIndex("id"));
String author = c.getString(c.getColumnIndex("author"));
String name = c.getString(c.getColumnIndex("name"));
} while(cursor.moveToNext());
}
cursor.close();
query()方法传入七个参数,第一个参是表名,第二个参数是想要返回的列的名称,三参数指定 where的约束条件 ,第四个参数为 where中的占位符提供具体的值,第五个参数为group by条件,第六个参数指having条件,第七个参数指查询结果的排序方式,
使用SQL语句:
db.rawQuery("select * from Book where author=?", new String[]{"liaowh"});
c.Update更新
SQLiteDatabase sqLiteDatabase = myDataBaseHelper.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("name","whliao");
sqLiteDatabase.update("book",contentValues,"author=?",new String[]{"liaowh"});
contentValues.clear();
update()方法传入四个参数,第一个参数是表名,第二个参数是ContentValues对象,第三参数指定 where的约束条件 ,第四个参数为 where中的占位符提供具体的值 。
使用SQL语句:
sqLiteDatabase.execSQL("update Book set name=? where author=?",new String[]{"whliao", "liaowh" });
d.Delete删除
SQLiteDatabase sqLiteDatabase = myDataBaseHelper.getWritableDatabase();
sqLiteDatabase.delete("book","author=?",new String[]{"liaowh"});
delete()方法传入三个参数,第一个参数是表名,第二个参数指定 where的约束条件 ,第三个参数为 where中的占位符提供具体的值 。
使用SQL语句:
[html] view plain copy
sqLiteDatabase.execSQL("delete from Book where author= ?", new String[] { "liaowh" });