Android中数据持久化技术
2023-01-30 本文已影响0人
BlueSocks
1、文件存储
文件存储不会对存储的数据进行任何的格式化处理,所有数据都是原封不动的保存到文件中,适合存储一些简单的文本数据或二进制数据。
Ⅰ文件写入
openFileOutput()
/**
* 写入数据
*/
private void writeData(String text){
FileOutputStream out = null;
BufferedWriter writer = null;
try {
out = openFileOutput("test", MODE_PRIVATE); // 两个参数:参数1是文件保存的文件名,参数2是保存模式,MODE_PRIVATE是如果文件已存在则替换,MODE_APPEND是文件已存在就在原文件拼接新数据
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(text);
}
catch (IOException e){
e.printStackTrace();
}
finally {
try {
if (writer != null)writer.close();
}
catch (IOException e){
e.printStackTrace();
}
}
}
Ⅱ文件读取
openFileInput()
/**
* 读取数据
*/
private String readData(String fileName){
if (fileName.isEmpty()) return null;
FileInputStream input = null;
BufferedReader reader = null;
StringBuilder stringBuilder = new StringBuilder();
try {
input = openFileInput(fileName);
reader = new BufferedReader(new InputStreamReader(input));
String line = "";
while ((line = reader.readLine()) != null){
stringBuilder.append(line);
}
}
catch (IOException e){
e.printStackTrace();
}
finally {
try {
if (reader != null) reader.close();
}
catch (IOException e){
e.printStackTrace();
}
}
return stringBuilder.toString();
}
2、sharedPreferences存储
使用键值对存储数据,支持多种不同的数据类型存储,读取和写入数据格式不变。
sharedPreferences存储首先要获取SharedPreferences实例对象,根据所在的不同的类有不同的获取方法,如下:
/**
* Context类中获取
*
* parmas name: 传入文件名,如果文件名不存在就新建一个该名文件;
* parmas model: 传入操作模式,目前只有MODE_PRIVATE这种模式可用,也是默认模式;
*/
getSharedPreferences("login", MODE_PRIVATE);
/**
* Activity类中获取,文件名默认为Activity类名
*
* parmas model: 传入操作模式,默认模式;
*/
getPreferences(MODE_PRIVATE);
/**
* PreferenceManager类中获取,默认使用应用程序包名作为文件名前缀
*
* parmas context: 传入所在上下文;
*/
PreferenceManager.getDefaultSharedPreferences(this);
Ⅰ存储数据
/**
* 存储数据
*/
private void saveData(){
// 获取SharedPreferences实例
SharedPreferences preferences = getSharedPreferences("login", MODE_PRIVATE);
// 获取Editor实例
SharedPreferences.Editor editor = preferences.edit();
// 获取数据
String account = accountET.getText().toString();
String password = passwordET.getText().toString();
// 通过键值添加数据
editor.putString("account", account);
editor.putString("password", password);
editor.putBoolean("isRemmber", true);
// 提交数据
editor.apply();
}
Ⅱ读取数据
/**
* 读取数据
*/
private void readData(){
// 获取SharedPreferences实例
SharedPreferences preferences = getSharedPreferences("login", MODE_PRIVATE);
// 读取数据
String account = preferences.getString("account", "");
String password = preferences.getString("password", "");
Boolean isRemmber = preferences.getBoolean("isRemmber",false);
// 控件赋值
accountET.setText(account);
passwordET.setText(password);
remmberCB.setChecked(isRemmber);
}
Ⅲ清空数据
/**
* 清空数据
*/
private void clearData(){
// 获取SharedPreferences实例
SharedPreferences preferences = getSharedPreferences("login", MODE_PRIVATE);
// 获取Editor实例
SharedPreferences.Editor editor = preferences.edit();
// 清空数据
editor.clear();
}
Tips:如果使用SharedPreferences直接保存用户名、密码等重要数据是不靠谱的,至少得将这些数据按照一定规则加密之后再保存到文件中!
3、SQLite存储
可用于存储大量的复杂的关系型数据,
Ⅰ创建数据库
新建一个MyDataBaseHelper类继承自SQLiteOpenHelper,并重写onCreate和onUpgrade方法,调用MyDataBaseHelper类的构造函数即可创建一个dbHelper,通过getWritableDatabase方法就可以获取到数据库
/**
* 创建数据库
*
* parmas context:上下文
* parmas name:数据库名称
* parmas factory:允许在查询数据时返回一个自定义的Cursor,一般传null
* parmas version:数据库版本
* return dbHelper:返回一个dbHelper实例对象,调用getWritableDatabase()方法就可以获取到数据库
*/
MyDataBaseHelper dbHelper = new MyDataBaseHelper(this, "DataCache.db", null, 2);
SQLiteDatabase db = dbHelper.getWritableDatabase();
Ⅱ更新数据库
直接调用创建数据库方法,传一个不同的数据库版本号会自动调MyDataBaseHelper类中的onUpgrade方法,在方法内更新数据库操作即可
/**
* 更新数据库
*/
MyDataBaseHelper dbHelper = new MyDataBaseHelper(this, "DataCache.db", null, 2);
Ⅲ创建表
/**
* 创建表
*
* 1、获取可操作数据库
* 2、调用execSQL方法执行SQL语句删除表
*/
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.execSQL("create table Book (id integer primary key autoincrement, author text, price real, pages integer, name text)");
Ⅳ删除表
/**
* 删除表
*
* 1、获取可操作数据库
* 2、调用execSQL方法执行SQL语句删除表
*/
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.execSQL("drop table if exists Book");
Ⅴ插入数据
/**
* 插入数据
*
* parmas table:要插入的表名
* parmas nullColumnHack:空值自动赋值null,一般用不到直接传null就行
* parmas factory:允许在查询数据时返回一个自定义的Cursor,一般传null
* parmas values:要插入的数据实例对象
*/
ContentValues values = new ContentValues();
values.put("author", "Lee");
values.put("price", 9.98);
values.put("pages", 496);
values.put("name", "How are you");
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.insert("Book", null, values);
Ⅵ更新数据
/**
* 更新数据
*
* parmas table:要插入的表名
* parmas values:要更新的数据实例对象
* parmas whereClause:SQL查询条件
* parmas whereArgs:查询条件参数数组,依然顺序从数据取值赋给前面查询条件中的?占位符
*/
ContentValues updateValue = new ContentValues();
updateValue.put("price", 10.99);
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.update("Book", updateValue, "name=?", new String[]{"How are you"});
Ⅶ删除数据
/**
* 删除数据
*
* parmas table:指定删除数据的表名
* parmas whereClause:指定查询条件
* parmas whereArgs:为查询条件的占位符提供具体值
*/
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.delete("Book", "pages > ?",new String[]{"500"});
Ⅷ查询数据
/**
* 查询数据
*
* parmas table:指定查询的表名
* parmas columns:指定查询的列名
* parmas section:指定查询条件
* parmas sectionArgs:为查询条件的占位符提供具体值
* parmas groupBy:指定需要groupBy的列
* parmas having:对groupBy的结果进一步约束
* parmas orderBy:指定查询结果的排序方式
* return cursor:返回一个可操作的cursor对象,操作cursor对象即可获取具体数据
*/
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = db.query("Book",null, null, null, null, null, null);