前言

我们这个系列主要来探究一下鸿蒙应用开发中对于数据保存的相关操作,而这个小节要介绍的就是我们短小精悍的首选项存储👏👏👏
一起加油吧!


用户首选项

用户首选项是一个轻量化的存储机制,内部采用键值对的方式存储数据,每一对数据在应用中都对应着一个Preferences实例,Preferences意为偏爱、偏好,这也与它的应用场景相对应

应用场景

用户首选项会将存储数据以键值对的方式存储在内存中,需要时从内存中读取,读取速度快,但也因为会储存在内存中,所以不宜存储大量数据,避免占用过多内存,在需要的时候可以通过flush接口将数据持久化,保存至文件中。

适宜使用在一些用户个性化数据的保存上,这也正与其实例名称相对应,如字体大小,主题颜色,隐私协议的同意状态等。

运作机制

优点

  • Preferences实例缓存在内存中,需要时直接从内存中读写数据,响应速度快,效率高
  • 开发便捷,无需复杂的SQL语句,同时支持全局唯一的储存空间,即数据的键值唯一
  • 相比数据库更加节约系统资源,适宜储存少量高频访问数据

限制

  • 键类型为string,要求非空且长度不超过1024个字节

在UTF-8中,英文字符占一个字节,中文汉字占3个字节

  • 值类型为string。需使用UTF-8编码,可以为空,不为空时长度不能超过16MB
  • 当存储数据中包含非UTF-8个格式的字符串时,需用Uint8Array类型存储,否则可能会造成文件损坏
  • 首选项因其设计母目的是为了轻量化的数据存储,原生不支持多进程下使用,当在多进程场景下使用,多个进程同时访问同一个Preferences实例时,可能会造成数据丢失的问题

场景实战

大家在QQ登录或者在一些其他网站登录时,为了下一次不用输密码,肯定都勾选过记住密码这一选项吧,这次我们就来实现一下这个功能

  • 首先我们需要一个登录页面,我们暂时不与里面的密码输入框联动,当我们打上勾选之后退出应用,这个状态是不会保存的,这时就该我们的用户首选项出场了。
    请添加图片描述
  • 我们在该勾选框的onChange事件中获取当前的选择框状态,状态用布尔类型的状态变量boxState来表示 ,然后在组件的aboutToAppear回调中创建首选项实例,其中getPreferencesSync是获取Preferences实例的一个同步方法,options为配置该实例的一些参数,name参数就是首选项实例的名称
  pre: preferences.Preferences | null = null;
  aboutToAppear(): void {
    let options: preferences.Options = {name: "myStore"}
    if(this.pre != null)
    this.pre = preferences.getPreferencesSync(getContext(this),options)
  }
  • 然后我们就可以进行读写操作了,我们在组件的aboutToDisappear回调中进行保存,即当用户即将退出程序,组价即将销毁时再保存数据,这里用putSync同步写入,第一次参数为键,第二个参数为值,随后使用flush方法实现持久化。
  aboutToDisappear(): void {
    if(this.pre!=null){
      try {
        this.pre.putSync('boxState',this.boxState)
        this.pre.flush()
        hilog.info(0x0000,'Prefer','写入成功')
      }catch (err){
        hilog.info(0x0000,'Prefer','写入失败:'+err)
      }
    }
  }
  • 最后再向aboutToAppear回调中添加读取部分,以下为完整代码
async aboutToAppear() {
    let options: preferences.Options = {name: "myStore"}
    if(this.pre == null){
      this.pre = preferences.getPreferencesSync(getContext(this),options)
      try {
        let result = await this.pre.get('boxState',undefined)
        if(result != undefined){
          this.boxState = result as boolean
          hilog.info(0x0000,'Prefer','读取成功')
        }
      }catch (err){
        hilog.info(0x0000,'Prefer','写入失败'+err)
      }
    }
  }

效果展示
可以看到单选框以选中状态退出时,再次打开依旧为选中状态,然后再将其修改为未选中状态退出时,再次打开单选框的状态就恢复初始状态
请添加图片描述

总结

这个小结我们学习了通过用户首选项来持久化数据,并完成了一个小demo,下一节我们将学习通过键值型数据库相关操作,继续努力吧!
不知道为啥感觉我水博客速度好慢呀,每次都要写很久,这里面有什么小技巧吗

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐