鸿蒙通过用户首选项实现数据持久化
- 其他
- 2025-09-17 09:42:01

鸿蒙通过用户首选项实现数据持久化 1.1 场景介绍
用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。当用户希望有一个全局唯一存储的地方,可以采用用户首选项来进行存储。Preferences会将该数据缓存在内存中,当用户读取的时候,能够快速从内存中获取数据,当需要持久化时可以使用flush接口将内存中的数据写入持久化文件中。Preferences会随着存放的数据量越多而导致应用占用的内存越大,因此,Preferences不适合存放过多的数据,也不支持通过配置加密,适用的场景一般为应用保存用户的个性化设置(字体大小,是否开启夜间模式)等。
2.1 运作机制用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。当用户希望有一个全局唯一存储的地方,可以采用用户首选项来进行存储。Preferences会将该数据缓存在内存中,当用户读取的时候,能够快速从内存中获取数据,当需要持久化时可以使用flush接口将内存中的数据写入持久化文件中。Preferences会随着存放的数据量越多而导致应用占用的内存越大,因此,Preferences不适合存放过多的数据,也不支持通过配置加密,适用的场景一般为应用保存用户的个性化设置(字体大小,是否开启夜间模式)等。
每个key的value的长度最大为8kb创建首选项-仓库的概念-应用可以有N个仓库,一个仓库中可以有N个key 3.1 接口说明 接口名称及方法签名描述参数同步/异步类型约束条件getPreferencesSync(context: Context, options: Options): Preferences获取 Preferences 实例context: 上下文对象options: 配置选项同步存在对应的异步接口putSync(key: string, value: ValueType): void写入键值对(需调用 flush 持久化存储)key: 键名value: 值(需满足 ValueType 类型要求)同步存在异步接口hasSync(key: string): boolean检查是否包含指定键的键值对key: 键名同步- 键名不能为空- 存在异步接口getSync(key: string, defValue: ValueType): ValueType获取键对应的值(若为空或类型不匹配则返回 defValue)key: 键名defValue: 默认值同步存在异步接口deleteSync(key: string): void删除指定键的键值对key: 键名同步存在异步接口flush(callback: AsyncCallback<void>): void将数据异步持久化到文件callback: 异步回调异步-on(type: 'change', callback: Callback<string>): void订阅数据变更事件(在 flush 后触发)type: 事件类型(仅支持 'change')callback: 回调函数(参数为变更的 key)--off(type: 'change', callback?: Callback<string>): void取消订阅数据变更事件type: 事件类型('change')callback: 可选回调函数-若未指定 callback 则取消全部订阅deletePreferences(context: Context, options: Options, callback: AsyncCallback<void>): void从内存移除实例并删除持久化文件(若有)context: 上下文对象options: 配置选项callback: 异步回调异步- 4.1 开发步骤 1.导入@kit.ArkData模块。 import { preferences } from "@kit.ArkData"; 2.获取preference实例,拿到仓库getPreferenceSync接受两个参数,其中一个参数是context,另一个参数是options
context代表了用户的上下文,是ability的能力级,也是ability的一个环境,这个东西如果想要获取分两种情况
在ability中区获取 在onWindowStageCreate写入这行代码即可
MyPreferenceClass.context = this.context在UI界面去拿
getContext(this)options 是传递给 preferences.getPreferencesSync() 的配置对象,用于定义存储实例的仓库名称、安全模式等关键属性
const store = preferences.getPreferencesSync(MyPreferenceClass.context||getContext(),{ //拿到该名称的仓库,拿不到就会给你创建该名称的仓库,类似数据库 name:'infoStore' }) return store 3.创建增删改的方法 //2.写入字段,持久化存储 static async putStore(info:string){ const store = MyPreferenceClass.getStore() store.putSync('info',info) await store.flush() } //3.获取数据 static getValue(){ const store = MyPreferenceClass.getStore() const value = store.getSync('info','666666') return value } //4.删除数据 static async deleteValue(){ const store = MyPreferenceClass.getStore() //如果不加上flush操作,只是在内存中删除,需要加上flush操作才能写入磁盘! store.deleteSync('info') await store.flush() } //5.判断数据是否存在 static judjeValue(val:string){ const store = MyPreferenceClass.getStore() const value = store.hasSync(val) return value } 4.测试代码 import { MyPreferenceClass } from './utils/MyPreferenceClass' @Entry @Component struct Mytest { // @State 实时更新 @State currentValue: string = '今天天气真不错!' @State JudeValue: boolean = false build() { //初始化默认值 Column({ space: 10 }) { Text(this.currentValue) Text(this.JudeValue + '') Button('写入数据') .onClick(() => { MyPreferenceClass.putStore('今天天气并不好') }) Button('展示数据') .onClick(() => { this.currentValue = MyPreferenceClass.getValue() as string }) Button('删除数据') .onClick(() => { MyPreferenceClass.deleteValue() }) Button('是否展示该数据') .onClick(() => { this.JudeValue = MyPreferenceClass.judjeValue('info') }) } .height('100%') .width('100%') }鸿蒙通过用户首选项实现数据持久化由讯客互联其他栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“鸿蒙通过用户首选项实现数据持久化”