目錄
- 1 使用方式
- 1.1 創建資料庫
- 1.2 讀操作
- 1.3 寫操作
- 2 坑
- 2.1 讀寫時context的選擇
- 2.2 應用重新啟動后相關檔案被洗掉
- 3 Preferences的封裝
??鴻蒙開發的Preferences是一種輕量級資料存盤方式,類似于安卓開發中的SharedPreferences,資訊在檔案中是以key-value方式存盤的,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<preferences version="1.0">
<string key="in_net">xxxxx</string>
<string key="year">2018</string>
<string key="sex">男</string>
<string key="sign">xxxxxx</string>
<string key="dept">xxxx</string>
<string key="stu_id">xxxxx</string>
<string key="major">計算機科學與技術</string>
<string key="name">xxxxxx</string>
</preferences>
1 使用方式
1.1 創建資料庫
??通過資料庫操作的輔助類可以獲取到要操作的Preferences實體,用于進行資料庫的操作:
DatabaseHelper databaseHelper = new DatabaseHelper(context);
Preferences preferences = databaseHelper.getPreferences(name);
??name表示檔案的名稱,如果已經存在該檔案則可以進行讀操作,否則新建一個檔案,
1.2 讀操作
String x = preferences.getString(String key, int defValue);
??此外還有getInt和getFloat等多種方法,
1.3 寫操作
preferences.putString(key, value).flushSync();
??其中flushSync將Preferences實體同步寫入檔案,此外還有異步寫入:flush,
2 坑
2.1 讀寫時context的選擇
??場景:我在MainAbility中創建了新的檔案user_info,現在需要在UserAbility中進行訪問,如果兩個Ability中在創建Preferences實體時均采用getContext()方式,即:
DatabaseHelper databaseHelper = new DatabaseHelper(getContext());
Preferences preferences = databaseHelper.getPreferences(name);
??那么最終結果是:在UserAbility中不能訪問到資料,這里需要注意的是:訪問時傳入的Context與創建時傳入的Context必須一致!!
??因此解決辦法有兩個:一是直接使用getApplicationContext(),二是在第三個Ability中定義一個公共靜態Context,
Context context = getApplicationContext();
Context context = MAbility.mContext;
2.2 應用重新啟動后相關檔案被洗掉
??場景:在第一次啟動應用時,輸入了相關賬號和登錄密碼,并利用Preferences將相關登錄資訊持久化地存盤到設備中,第二次在該設備上運行同一應用時會判斷是否存在該檔案,如果存在就直接跳轉到登錄后的界面,否則需要重新登錄,但除錯時發現:每次重新啟動應用后相關檔案都被洗掉了,
??原因:DevEco每次重新啟動應用時都是卸載了之前的應用后重新部署,因此相關資訊會被清除,
??解決:
??DevEco中打開Run->Edit Configuration,勾選Replace existing application選項,

3 Preferences的封裝
package com.example.ncepu.Utils;
import com.example.ncepu.MyApplication;
import ohos.app.Context;
import ohos.data.DatabaseHelper;
import ohos.data.preferences.Preferences;
public class PreferenceUtils {
public static PreferenceUtils preferenceUtils = null;
private static String name = "user_info";
public static PreferenceUtils getInstance() {
if(preferenceUtils == null) {
preferenceUtils = new PreferenceUtils();
}
return preferenceUtils;
}
public Preferences getApplicationPref(Context context) {
DatabaseHelper databaseHelper = new DatabaseHelper(context);
return databaseHelper.getPreferences(name);
}
public void putString(String key, String value) {
preferenceUtils.getApplicationPref(MyApplication.context).putString(key, value).flushSync();
}
public String getString(String key, String defValue) {
return preferenceUtils.getApplicationPref(MyApplication.context).getString(key, defValue);
}
}
使用:
PreferenceUtils.getInstance().putString("id", _id);
String id = PreferenceUtils.getInstance().getString("id", "");
??Android開發中SharedPreferences的使用請參考:安卓利用SharedPreferences保存登錄資訊,防止重復登錄
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/317971.html
標籤:其他
