App要是不支持離線查看數(shù)據(jù)內(nèi)容,大概會(huì)造成極差的用戶體驗(yàn)吧
持久化技術(shù)
簡介
Android內(nèi)置的實(shí)現(xiàn)持久化功能的方式如下
- 文件存儲(chǔ)
- SharePreference
- 數(shù)據(jù)庫存儲(chǔ)
- SD卡(與文件存儲(chǔ)類似,需要權(quán)限)
文件存儲(chǔ)
數(shù)據(jù)一般會(huì)被存儲(chǔ)到/data/data/<package name>/files/目錄之下
存數(shù)據(jù)
public static void save(String str, Context context) {
String data = str;
FileOutputStream out = null;
BufferedWriter writer = null;
try {
//這里的save就是files目錄下的文件名
out = context.openFileOutput("save", Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(str);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null) {
writer.close();
}
assert out != null;
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
布局如圖
布局
在Edittext中輸入Hello Stars
點(diǎn)擊Save府寒,即完成保存操作
-
點(diǎn)擊菜單欄中的View->Device File Explorer
Device File Explorer -
找到目錄/data/data/<package name>/files/
目錄
5.雙擊save文件,就能看到數(shù)據(jù)啦
數(shù)據(jù)
取出數(shù)據(jù)
過程大同小異,取出數(shù)據(jù)后就可以在TextView中顯示啦
public static String read(Context context) {
FileInputStream in = null;
BufferedReader reader = null;
StringBuilder stringBuilder = new StringBuilder();
String data = "";
try {
in = context.openFileInput("save");
reader = new BufferedReader(new InputStreamReader(in));
while ((data = reader.readLine()) != null) {
stringBuilder.append(data);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return stringBuilder.toString();
}
效果圖
效果圖
SharePreference存儲(chǔ)
與文件存儲(chǔ)相比悦陋,代碼量少很多,同理也是打開Device File Explorer,目錄由files變?yōu)閟hared_prefs即可查看了
image.png
public static void writeInSp(Context context, String value) {
SharedPreferences.Editor editor = context.getSharedPreferences("save", Context.MODE_PRIVATE).edit();
editor.putString("key", value);
editor.apply();
}
public static String readFromSp(Context context) {
SharedPreferences sp = context.getSharedPreferences("save", Context.MODE_PRIVATE);
return sp.getString("key", "defValue");
}
SQLite存儲(chǔ)
SQLite是一款比較輕量的數(shù)據(jù)庫,運(yùn)算速度快,占用內(nèi)存少
建表
public class DbHelper extends SQLiteOpenHelper {
private Context context;
public DbHelper(Context context) {
//List是數(shù)據(jù)庫的名字
super(context, "List.db", null, 1);
this.context = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
//這里為List數(shù)據(jù)庫建立了一張Student的表,數(shù)據(jù)庫可以有多張表
String sql = "create table Student (id integer primary key autoincrement, name text, number integer)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//此處對(duì)表進(jìn)行更新,可以對(duì)表進(jìn)行增刪改操作
}
}
布局如圖,這里我已經(jīng)插入了數(shù)據(jù)
布局.png
增
- 寫入姓名填入:hhh筑辨,寫入學(xué)號(hào)填入:666
//Button 增的點(diǎn)擊事件中
ContentValues cv = getContentValues();
db.insert("Student", null, cv);
//填入CV
@NonNull
private ContentValues getContentValues() {
String name = etName.getText().toString();
String number = etNumber.getText().toString();
ContentValues cv = new ContentValues();
if (!name.isEmpty() && !number.isEmpty()) {
cv.put("name", name);
cv.put("number", number);
}
return cv;
}
image.png
刪
這里是通過學(xué)號(hào)刪除俺驶,寫入學(xué)號(hào)填入:1
//onClick事件監(jiān)聽器中的代碼
String number = etNumber.getText().toString();
if (!number.isEmpty())
//"number = ?", new String[]{number} 這里就是查詢條件,即number = number(etNumber中的數(shù)據(jù))棍辕,也可以將 = 換成 > 或 <
db.delete("Student", "number = ?", new String[]{number});
image.png
改
這里是根據(jù)名字改學(xué)號(hào)
String name = etName.getText().toString();
if (!name.isEmpty())
db.update("Student", getContentValues(), "name = ?", new String[]{name});
將libai的學(xué)號(hào)改為1
image.png
查
這里是查詢表中的所有數(shù)據(jù)暮现,表名為Student,無約束條件
StringBuilder stringBuilder = new StringBuilder();
Cursor cursor = db.query("Student", null, null, null, null, null, null, null);
if (cursor.moveToFirst()) {
do {
String n = cursor.getString(cursor.getColumnIndex("name"));
String b = cursor.getString(cursor.getColumnIndex("number"));
stringBuilder.append("姓名:" + n + ",學(xué)號(hào):" + b + "\n");
} while (cursor.moveToNext());
}
tvStudent.setText("學(xué)生數(shù)據(jù):\n" + stringBuilder.toString());
cursor.close();
Tips
- MODE_PRIVATE:這是上文中我們使用文件存儲(chǔ)楚昭,SP存儲(chǔ)用到的模式栖袋,該模式下,只能允許調(diào)用應(yīng)用程序訪問哪替,其他的無權(quán)限
- 現(xiàn)在Github中有各種各樣的數(shù)據(jù)庫框架栋荸,如Litepal,Jetpack組建中的Room凭舶,GreenDao等晌块,各有優(yōu)勢(shì),雖不能一一學(xué)習(xí)帅霜,但可以查看介紹匆背,挑著來學(xué)