HarmonyOS的用户首选项模块(Preferences)可以支持简单数据的本地化存储,它被保存在APP的沙盒中,APP重启不会清空。
Preferences当前性能较优,正常情况下不会造成卡顿,对应用流畅度也不会造成影响
当前更推荐同步方法,相比异步,同步更快(异步频繁调用可能出现排队等情况)
1、getPreferencesSync方法是需要把文件从设备读取到内存,文件不是特别大的话,读取不会有太大影响。
2、getSync是直接从内存中读取,基本不会有什么耗时
3、putSync方法同理。调用flush的时候,才会持久化到文件中
如果数据过大时,推荐使用关系型数据库实现数据持久化
参考链接:
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/data-persistence-by-rdb-store-V5
Preferences默认支持存储基本数据类型(如字符串、数字、布尔值等),但不直接支持JSON对象存储。可以通过将JSON对象序列化为字符串后存储,读取时再反序列化为JSON对象。以下是具体实现步骤:
1. 导入模块
在项目中导入preferences模块:
1 |
import { preferences } from '@ohos.data.preferences'; |
或者使用@kit.ArkData模块:
1 |
import { preferences } from '@kit.ArkData'; |
2. 获取Preferences实例
通过getPreferences方法获取Preferences实例,指定存储的文件名:
1 2 |
let options: preferences.Options = { name: 'myStore' }; let pref = await preferences.getPreferences(options); |
3. 封装JSON数据存储方法
创建一个类或工具函数来封装JSON数据的存储和读取逻辑:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class JsonPreferenceManager { private pref: preferences.Preferences; constructor(prefName: string) { this.pref = preferences.getPreferencesSync(null, { name: prefName }); } async put(key: string, value: any): Promise<void> { if (typeof value === 'object') { value = JSON.stringify(value); // 将JSON对象序列化为字符串 } await this.pref.put(key, value); await this.pref.flush(); // 持久化存储 } async get(key: string, defaultValue?: any): Promise<any> { let value = await this.pref.get(key, defaultValue); if (typeof value === 'string' && isJsonObject(value)) { value = JSON.parse(value); // 将字符串反序列化为JSON对象 } return value; } } |
4. 使用封装的类
实例化JsonPreferenceManager类,并使用封装的方法存储和读取JSON数据:
1 2 3 4 5 6 7 8 |
const jsonPrefManager = new JsonPreferenceManager('myJsonStore'); // 存储JSON数据 await jsonPrefManager.put('userSettings', { name: 'John', age: 30 }); // 读取JSON数据 let userSettings = await jsonPrefManager.get('userSettings'); console.log(userSettings); // 输出:{ name: 'John', age: 30 } |
注意事项
在存储JSON对象时,需要先将其序列化为字符串。
在读取时,需要判断是否为JSON字符串,然后进行反序列化。
由于Preferences存储的大小有限,建议不要存储过大的JSON数据。