鸿蒙开发的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保存登录信息,防止重复登录