1,概述
鸿蒙轻量级偏好数据库-Preferences。
轻量级偏好数据库主要提供轻量级Key-Value键值对形式操作,支持少量数据,数据存在在本地文件中,同时也加载在内存中,所以速度快,效率高,属于非关系型数据库,不宜存储大量数据。
运作机制如图:
约束与限制:
(1)Key键为String类型,要求非空且大小不超过80个字符。
(2)如果Value值为String类型,可以为空但是长度不超过8193个字符。
(3)存储的数据应该是轻量级的,建议存储的数据不超过一万条,否则会在内存方面产生较大的开销。
2,使用
数据存储形式为键值对,键的类型为字符串型,值的存储数据类型包括整型、字符串型、布尔型、浮点型、长整型、字符串型 Set 集合。
(1)获取 Preferences 实例
读取指定文件,将数据加载到 Preferences 实例,用于数据操作。
DatabaseHelper databaseHelper = new DatabaseHelper(context);// context入 参类型为ohos.app.ContextString fileName = "name";Preferences preferences = databaseHelper.getPreferences(fileName);
(2)从指定文件读取数据
首先获取指定文件对应的 Preferences 实例,然后借助 Preferences API 读取数据。
java 接口 读取整型数据
int value = preferences.getInt("intKey", 0);
(3)将数据写入指定文件
首先获取指定文件对应的 Preferences 实例,然后借助 Preferences API 将数据写入 Preferences 实例,通过 flush 或者 flushSync 将 Preferences 实例持久化
异步:
preferences.putInt("intKey", 3);preferences.putString("StringKey", "String value");preferences.flush();
同步:
preferences.putInt("intKey", 3);preferences.putString("StringKey", "String value");preferences.flushSync();
区别:
flush 异步:插入数据不需要等待反馈即可插入下一组数据。
flushSync 同步:插入数据有反馈后再插入下一组数据。
(4)注册观察者
开发者可以向 Preferences 实例注册观察者,观察者对象需实现Preferences.PreferencesObserver 接口。flushSync() 或 flush() 执行后,该 Preferences 实例注册的所有观察者的 onChange() 方法都会被回调。不再需要观察者时请注销
private class PreferencesChangeCounter implements Preferences.PreferencesObserver {final AtomicInteger notifyTimes = new AtomicInteger(0);@Override public void onChange(Preferences preferences, String key) {if ("intKey".equals(key)) {notifyTimes.incrementAndGet(); } }}// 向preferences实例注册观察者PreferencesChangeCounter counter = new PreferencesChangeCounter();preferences.registerObserver(counter);// 修改数据preferences.putInt("intKey", 3);boolean result = preferences.flushSync();// 修改数据后,onChange方法会被回调,notifyTimes == 1int notifyTimes = counter.notifyTimes.intValue();// 向preferences实例注销观察者preferences.unRegisterObserver(counter);
(5)移除 Preferences 实例
从内存中移除指定文件对应的 Preferences 单实例。移除 Preferences 单实例时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题。
DatabaseHelper databaseHelper = new DatabaseHelper(context);// 指定文件名称String fileName = "name";databaseHelper.removePreferencesFromCache(fileName);
(6)删除指定文件
从内存中移除指定文件对应的 Preferences 单实例,并删除指定文件及其备份文件、损坏文件。删除指定文件时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题
DatabaseHelper databaseHelper = new DatabaseHelper(context);// 指定文件名称String fileName = "name";boolean result = databaseHelper.deletePreferences(fileName);
(7)移动指定文件
从源路径移动文件到目标路径。移动文件时,应用不允许再操作该文件数据,否则会出现数据一致性问题。
Context targetContext = XXX;DatabaseHelper databaseHelper = new DatabaseHelper(targetContext);// 指定文件名称String srcFile = "srcFile";String targetFile = "targetFile";Context srcContext = XXX;boolean result = databaseHelper.movePreferences(srcContext,srcFile,targetFile);
3,总结
(1)Preferences数据既写入到本地文件中又在内存缓存map中,数据写入在内存中占用内存资源,说明不宜大量数据存储。
(2)鸿蒙Preferences在写入或更新数据的时候会有同步或异步两种选择,在数据较少,操作量不大的时候建议使用同步flushSync操作方式。而异步操作一般是在数据量大,操作时间长情况下通过队列排队处理,一般较少使用。
(3)鸿蒙Preferences的存储数据每次都会清空之前的数据,每次会保留新的数据,而不是增量存储。
(4)跟安卓相比鸿蒙已经不需要通过Editor去put数据了,而通过Preferences实例直接存取。
声明:该博客大部分信息来自于鸿蒙官方文档。少部分自己总结,如果不明白请参考官方文档。