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

2025-03-22 15:45:10
137次阅读
0个评论

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

1.1 场景介绍

用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。当用户希望有一个全局唯一存储的地方,可以采用用户首选项来进行存储。Preferences会将该数据缓存在内存中,当用户读取的时候,能够快速从内存中获取数据,当需要持久化时可以使用flush接口将内存中的数据写入持久化文件中。Preferences会随着存放的数据量越多而导致应用占用的内存越大,因此,Preferences不适合存放过多的数据,也不支持通过配置加密,适用的场景一般为应用保存用户的个性化设置(字体大小,是否开启夜间模式)等。

2.1 运作机制

用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。当用户希望有一个全局唯一存储的地方,可以采用用户首选项来进行存储。Preferences会将该数据缓存在内存中,当用户读取的时候,能够快速从内存中获取数据,当需要持久化时可以使用flush接口将内存中的数据写入持久化文件中。Preferences会随着存放的数据量越多而导致应用占用的内存越大,因此,Preferences不适合存放过多的数据,也不支持通过配置加密,适用的场景一般为应用保存用户的个性化设置(字体大小,是否开启夜间模式)等。

  • 每个key的value的长度最大为8kb
  • 创建首选项-仓库的概念-应用可以有N个仓库,一个仓库中可以有N个key

image-20250302113249158

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的一个环境,这个东西如果想要获取分两种情况

    1. 在ability中区获取 在onWindowStageCreate写入这行代码即可

        MyPreferenceClass.context = this.context
      
    2. 在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%')
  
}

img

收藏00

登录 后评论。没有帐号? 注册 一个。