Andoid数据持久化的方式有3种:文件存储,偏好设置(SharedPreferences)存储和数据库存储.其中文件存储主要是存储一些简单数据和应用预置数据,如一些默认文字和语句等.偏好设置用于用户的个性化定制,如账号,密码和选项等.强大的数据库用于存储赋值的数据或者是数量比较大型的数据.三种存储方式,都存储在App文件包的data文件夹下,都涉及到读/存双向处理的知识.下面详细介绍各自的使用方式.
文件存储
和java语言类似,文件的读/写都是采用文件流的方式来实现,为了更好的适配,Android中又对java的文件流进行了封装.
由于读和写具有对称性,下面以写为例介绍一下具体实现.首先通过openFileInput方法传入文件名aa,创建文件.然后通过返回的FileInputStream实例对象,创建InputStreamReader,最后可以创建BufferedReader对象用于文件的连续存取.由于用openFileInput打开文件,有可能发生IO错误,所以需要try语句来处理.
<1>写入文件
public void save(String inputText) {
FileOutputStream fileOutputStream = null;
BufferedWriter bufferedWriter = null;
try {
fileOutputStream = openFileOutput("data", Context.MODE_PRIVATE);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);
bufferedWriter = new BufferedWriter(outputStreamWriter);
bufferedWriter.write(inputText);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bufferedWriter != null) {
bufferedWriter.close();
Toast.makeText(this, "Storing succeeded", Toast.LENGTH_SHORT).show();
}
}catch (IOException e){
e.printStackTrace();
}
}
}
<2>读取文件
public String load(){
FileInputStream fileInputStream = null;
BufferedReader bufferedReader = null;
StringBuilder stringBuilder = new StringBuilder();
try {
fileInputStream = openFileInput("data");
bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream)) ;
String line = "";
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line);
}
}catch (IOException e){
e.printStackTrace();
}finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
return stringBuilder.toString();
}
偏好设置SharedPreferences
用SharedPreferences存储数据,是三种中最简单的方式,可以用3中不同的方式来获取.
<1>Context类中的getSharedPreferences()方法.该方法接收的第一个参数为为文件名,第二个参数为文件读取方式.
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();
editor.putString("name", "Tom");
editor.putInt("age", 28);
editor.putBoolean("married", false);
editor.commit();
}
});
<2>Activity类中的getPreferences()方法,会自动以当前类名创建文件,使用方式参照1.
<3>PreferenceManager类中的getDefaultSharedPreferences,会以当前包名创建文件,在MainActivity中具体使用方式如下.
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
Button loginButton = (Button)findViewById(R.id.login_button);
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SharedPreferences.Editor editor = pref.edit();
if (rememberPass.isChecked()) {
editor.putBoolean("remember_pass", true);
} else {
editor.clear();
}
editor.apply();
}
});
数据库存储
Andorid中内置了SQLite3,我们可以向书写数据库语句一样,创建数据库中的表,在表中对数据进行C(create)R(retrieve)U(update)D(delete)操作.
在Android中可以使用SQLiteOpenHelper的抽象类来实现具体操作.首先需要新建继承自SQLiteOpenHelper的实体类,需要重写onCreate和onUpgrade两个方法,实现数据库的创建和更新.下面实现MyOpenHelper类,其中构造方法中的最后一个参数version表示创建数据库时的版本,当更新数字时,就会调用重写的onUpgrade方法.
public class MyOpenHelper extends SQLiteOpenHelper {
public static final String CREATE_BOOK = "create table Book (" +
"id integer primary key autoincrement," +
"author text," +
"price real," +
"pages integer," +
"name text)";
public static final String CREATE_CATEGORY = "create table Category (" +
"id integer primary key autoincrement," +
"category_name text," +
"category_code integer)";
private Context mContext;
public MyOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CREATE_BOOK);
sqLiteDatabase.execSQL(CREATE_CATEGORY);
Toast.makeText(mContext,"create success", Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
sqLiteDatabase.execSQL("drop table if exists Book");
sqLiteDatabase.execSQL("drop table if exists Category");
onCreate(sqLiteDatabase);
Toast.makeText(mContext,"update success", Toast.LENGTH_SHORT).show();
}
}
使用MyOpenHelper类.
//创建BookStore.db数据库
MyOpenHelper myOpenHelperSecond = new MyOpenHelper(this, "BookStore.db", null, 1);
Button btn = (Button)findViewById(R.id.create_database);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
db = myOpenHelper.getWritableDatabase();
}
});
//添加数据
btn3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//MainActivity.this 是否和 MainActivity.class 一样?
myOpenHelperSecond = new MyOpenHelper(MainActivity.this, "BookStore.db", null, 3);
SQLiteDatabase db = myOpenHelperSecond.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("author", "David");
values.put("price", 16.10);
values.put("pages", 200);
values.put("name", "cocopod");
db.insert("Book", null, values);
values.clear();
values.put("author", "David2");
values.put("price", 16.11);
values.put("pages", 201);
values.put("name", "cocopod2");
db.insert("Book2", null, values);
}
});
//更新数据
btn4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//MainActivity.this 是否和 MainActivity.class 一样?
myOpenHelperSecond = new MyOpenHelper(MainActivity.this, "BookStore.db", null, 4);
SQLiteDatabase db = myOpenHelperSecond.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("author", "David");
values.put("price", 15.99);
db.update("Book", values, "name = ?", new String[]{"cocopod"});
}
});
//删除数据
btn5.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//MainActivity.this 是否和 MainActivity.class 一样?
myOpenHelperSecond = new MyOpenHelper(MainActivity.this, "BookStore.db", null, 5);
SQLiteDatabase db = myOpenHelperSecond.getWritableDatabase();
db.delete("Book", "pages > ?", new String[]{"500"});
}
});
//查询数据
btn6.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//MainActivity.this 是否和 MainActivity.class 一样?
myOpenHelperSecond = new MyOpenHelper(MainActivity.this, "BookStore.db", null, 3);
SQLiteDatabase db = myOpenHelperSecond.getWritableDatabase();
Cursor cursor = db.query("Book", null, null, null, null, null,null, null);
if (cursor.moveToFirst()){
do {
String author = cursor.getString(cursor.getColumnIndex("author"));
Float price = cursor.getFloat(cursor.getColumnIndex("price"));
int pages = cursor.getInt(cursor.getColumnIndex("pages"));
String name = cursor.getString(cursor.getColumnIndex("name"));
Log.e("MainActivity", "author = "+author + "price = "+price.toString()
+ "pages = "+pages
+ "name = " + name);
}while (cursor.moveToNext());
}
cursor.close();
}
});
对数据库的实现,有使用起来更方便的开源工程LitePal,详细请移步github.
总结
数据持久化存储的3中方式,本质上都是将数据保存在本地的App中,都有各自的使用场景.其中SharedPreferences的使用比较简单,也是最普遍的使用方式.数据库的使用,需要对数据库操作语句有一定的熟悉和了解.文件存取的方式步骤较为复杂,使用的频度也最低.
喜欢和关注都是对我的鼓励和支持~