harmony OS NEXT-通过用户首选项实现数据持久化

打印 上一主题 下一主题

主题 950|帖子 950|积分 2850

鸿蒙通过用户首选项实现数据持久化

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模块。

  1. import { preferences } from "@kit.ArkData";
复制代码
2.获取preference实例,拿到仓库

getPreferenceSync担当两个参数,其中一个参数是context,另一个参数是options


  • context代表了用户的上下文,是ability的能力级,也是ability的一个环境,这个东西假如想要获取分两种环境

    • 在ability中区获取 在onWindowStageCreate写入这行代码即可
      1.   MyPreferenceClass.context = this.context
      复制代码
    • 在UI界面去拿
      1. getContext(this)
      复制代码

  • options 是传递给 preferences.getPreferencesSync() 的设置对象,用于界说存储实例的仓库名称、安全模式等关键属性
  1.   const store = preferences.getPreferencesSync(MyPreferenceClass.context||getContext(),{
  2.        //拿到该名称的仓库,拿不到就会给你创建该名称的仓库,类似数据库
  3.        name:'infoStore'
  4.      })
  5.     return store
复制代码
3.创建增编削的方法

  1.    //2.写入字段,持久化存储
  2.   static async  putStore(info:string){
  3.     const store = MyPreferenceClass.getStore()
  4.     store.putSync('info',info)
  5.    await store.flush()
  6.   }
  7.     //3.获取数据
  8.   static getValue(){
  9.     const store = MyPreferenceClass.getStore()
  10.     const value = store.getSync('info','666666')
  11.     return value
  12.   }
  13.   
  14.     //4.删除数据
  15.   static async deleteValue(){
  16.     const store = MyPreferenceClass.getStore()
  17.     //如果不加上flush操作,只是在内存中删除,需要加上flush操作才能写入磁盘!
  18.    store.deleteSync('info')
  19.     await store.flush()
  20.   }
  21.   //5.判断数据是否存在
  22.   static judjeValue(val:string){
  23.     const store = MyPreferenceClass.getStore()
  24.    const value =  store.hasSync(val)
  25.     return value
  26.   }
复制代码
4.测试代码

  1. import { MyPreferenceClass } from './utils/MyPreferenceClass'
  2. @Entry
  3. @Component
  4. struct Mytest {
  5.     // @State 实时更新
  6.   @State currentValue: string = '今天天气真不错!'
  7.   @State JudeValue: boolean = false
  8.   build() {
  9.     //初始化默认值
  10.     Column({ space: 10 }) {
  11.       Text(this.currentValue)
  12.       Text(this.JudeValue + '')
  13.       Button('写入数据')
  14.         .onClick(() => {
  15.           MyPreferenceClass.putStore('今天天气并不好')
  16.         })
  17.       Button('展示数据')
  18.         .onClick(() => {
  19.           this.currentValue = MyPreferenceClass.getValue() as string
  20.         })
  21.       Button('删除数据')
  22.         .onClick(() => {
  23.           MyPreferenceClass.deleteValue()
  24.         })
  25.       Button('是否展示该数据')
  26.         .onClick(() => {
  27.           this.JudeValue = MyPreferenceClass.judjeValue('info')
  28.         })
  29.     }
  30.     .height('100%')
  31.     .width('100%')
  32.   
  33. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户国营

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表