概念
轻量级数据存储适用于对Key-Value结构的数据进行存取和持久化操作。
运作机制
应用获取某个轻量级存储对象后,该存储对象中的数据将会被缓存在内存中,以便应用获得更快的数据存取速度。应用也可以将缓存的数据再次写回文本文件中进行持久化存储,由于文件读写将产生不可避免的系统资源开销,建议应用减少对持久化文件的读写频率。
约束与限制
- 因Preferences实例会加载到内存中,建议存储的数据不超过一万条,并及时清理不再使用的实例,以便减少非内存开销。
- 数据中的key为string类型,要求非空且字符长度不超过80个。
- 当数据中的value为string类型时,允许为空,字符长度不超过8192个。
- 当value值为字符串型Set集合类型时,要求集合元素非空且字符长度不超过8192个。
获取文件对应的Preferences单实例,用于数据操作。
Context context = getContext(); // 数据文件存储路径:/data/data/{PackageName}/{AbilityName}/preferences。
// Context context = getApplicationContext(); // 数据文件存储路径:/data/data/{PackageName}/preferences。
DatabaseHelper databaseHelper = new DatabaseHelper(context); // context入参类型为ohos.app.Context。
String fileName = "test_pref"; // fileName表示文件名,其取值不能为空,也不能包含路径,默认存储目录可以通过context.getPreferencesDir()获取。
Preferences preferences = databaseHelper.getPreferences(fileName);//获取文件对应的Preferences单实例,用于数据操作。
类名 | 接口名 | 描述 |
---|---|---|
DatabaseHelper | DatabaseHelper(Context context) | DatabaseHelper是数据库操作的辅助类,当数据库创建成功后,数据库文件将存储在由上下文指定的目录里。数据库文件存储的路径会因指定不同的上下文存在差异 |
DatabaseHelper | Preferences getPreferences(String name) | 获取文件对应的Preferences单实例,用于数据操作。 |
存入数据
preferences.putInt("intKey", 3);
preferences.putString("StringKey", "String value");
存入接口
类名 | 接口名 | 描述 |
---|---|---|
Preferences | Preferences putInt(String key, int value) | 设置Preferences实例中键对应的int类型的值。 |
Preferences | Preferences putString(String key, String value) | 设置Preferences实例中键对应的String类型的值。 |
读取数据
int value = preferences.getInt("intKey", 0);
读取接口
类名 | 接口名 | 描述 |
---|---|---|
Preferences | int getInt(String key, int defValue) | 获取键对应的int类型的值。 |
Preferences | float getFloat(String key, float defValue) | 获取键对应的float类型的值。 |
数据持久化
存入数据到实例后,可以通过flush或者flushSync方法将Preferences实例回写到文件中。
preferences.flush(); // 异步方法
bool result = preferences.flushSync(); // 同步方法
轻量级数据持久化接口
类名 | 接口名 | 描述 |
---|---|---|
Preferences | void flush() | 将Preferences实例异步写入文件。 |
Preferences | boolean flushSync() | 将Preferences实例同步写入文件。 |
订阅数据变化
订阅数据变化需要指定PreferencesObserver作为回调方法。订阅的key的值发生变更后,当执行flush方法时,PreferencesObserver被回调。
private class PreferencesObserverImpl implements Preferences.PreferencesObserver {
@Override
public void onChange(Preferences preferences, String key) {
if ("intKey".equals(key)) {
HiLog.info(LABLE, "Change Received:[key=value]");
}
}
}
// 订阅数据变化
PreferencesObserverImpl observer = new PreferencesObserverImpl();
preferences.registerObserver(observer);
// 修改数据
preferences.putInt("intKey", 3);
// 触发订阅者回调方法执行
preferences.flush();
// 修改数据后,observer的onChange方法会被回调
// 注销订阅
preferences.unRegisterObserver(observer);
订阅数据变化接口
类名 | 接口名 | 描述 |
---|---|---|
Preferences | void registerObserver(PreferencesObserver preferencesObserver) | 订阅数据变化。 |
Preferences | void unRegisterObserver(PreferencesObserver preferencesObserver) | 注销订阅。 |
Preferences.PreferencesObserver | void onChange(Preferences preferences, String key) | 订阅者的回调方法,数据变化会触发回调该方法。 |
移除实例
DatabaseHelper databaseHelper = new DatabaseHelper(context);
String fileName = "name"; // fileName表示文件名,其取值不能为空,也不能包含路径。
databaseHelper.removePreferencesFromCache(fileName);
类名 | 接口名 | 描述 |
---|---|---|
DatabaseHelper | boolean deletePreferences(String name) | 将Preferences实例从内存中移除,同时删除其在设备上的持久化文件。 |
DatabaseHelper | void removePreferencesFromCache(String name) | 仅将Preferences实例从内存中移除。 |
移动指定文件
从源路径移动文件到目标路径。移动文件时,应用不允许再操作该文件数据,否则会出现数据一致性问题。
Context targetContext = getContext();
DatabaseHelper databaseHelper = new DatabaseHelper(targetContext);
String srcFile = "srcFile"; // srcFile表示源文件名或者源文件的绝对路径,不能为相对路径,其取值不能为空。当srcFile只传入文件名时,srcContext不能为空。
String targetFile = "targetFile"; // targetFile表示目标文件名,其取值不能为空,也不能包含路径。
Context srcContext = getApplicationContext();
boolean result = databaseHelper.movePreferences(srcContext, srcFile, targetFile);
类名 | 接口名 | 描述 |
---|---|---|
DatabaseHelper | boolean movePreferences(Context sourceContext, String sourceName, String targetName) | 移动数据持久化文件。 |