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

电子说

1.4w人已加入

描述

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

## 1.1 场景介绍

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

## 2.1 运作机制

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

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

![image-20250302113249158](https://i-blog.csdnimg.cn/img_convert/3eafa43421dce706c4c62eb946e349c6.png)

## 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`                 | 将数据异步持久化到文件                                | `callback`: 异步回调                                         | 异步          | -                                  |
| `on(type: 'change', callback: Callback): void`       | 订阅数据变更事件(在 `flush` 后触发)                 | `type`: 事件类型(仅支持 `'change'`)
`callback`: 回调函数(参数为变更的 `key`) | -             | -                                  |
| `off(type: 'change', callback?: Callback): void`     | 取消订阅数据变更事件                                  | `type`: 事件类型(`'change'`)
`callback`: 可选回调函数   | -             | 若未指定 `callback` 则取消全部订阅 |
| `deletePreferences(context: Context, options: Options, callback: AsyncCallback): void` | 从内存移除实例并删除持久化文件(若有)                | `context`: 上下文对象
`options`: 配置选项
`callback`: 异步回调 | 异步          | -                                  |

## 4.1 开发步骤

### 1.导入@kit.ArkData模块。

```ts
import { preferences } from "@kit.ArkData";
```

### 2.获取preference实例,拿到仓库

`getPreferenceSync`接受两个参数,其中一个参数是context,另一个参数是options

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

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

    ```ts
      MyPreferenceClass.context = this.context
    ```

 2. 在UI界面去拿

    ```ts
    getContext(this)
    ```

* `options` 是传递给 `preferences.getPreferencesSync()` 的配置对象,用于定义存储实例的仓库名称、安全模式等关键属性

```ts
 const store = preferences.getPreferencesSync(MyPreferenceClass.context||getContext(),{
      //拿到该名称的仓库,拿不到就会给你创建该名称的仓库,类似数据库
      name:'infoStore'
    })
   return store
```

### 3.创建增删改的方法

```ts
  //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.测试代码

```ts
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%')
 
}
```

 

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分