鸿蒙通过用户首选项实现数据持久化
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 = falsebuild() {//初始化默认值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%')}