0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

程奕红 ? 来源:jf_34770892 ? 作者:jf_34770892 ? 2025-04-29 16:38 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

## 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%')

}
```



审核编辑 黄宇

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

    关注

    60

    文章

    2655

    浏览量

    44333
  • Harmony
    +关注

    关注

    0

    文章

    108

    浏览量

    3089
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    鸿蒙OS开发实例:【工具类封装-首选项本地存储】

    **import dataPreferences from '@ohos.data.preferences'; import bundleManager from '@ohos.bundle.bundleManager';** 本地首选项数据的保存,利用key val
    的头像 发表于 03-28 15:45 ?2373次阅读
    鸿蒙<b class='flag-5'>OS</b>开发实例:【工具类封装-<b class='flag-5'>首选项</b>本地存储】

    HarmonyOS开发案例:【用户首选项

    用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久轻量级数据,常用于保存
    的头像 发表于 04-18 15:34 ?1551次阅读
    HarmonyOS开发案例:【<b class='flag-5'>用户</b><b class='flag-5'>首选项</b>】

    HarmonyOS开发案例:【首选项

    基于HarmonyOS的首选项能力实现的一个简单示例。
    的头像 发表于 04-19 16:20 ?1827次阅读
    HarmonyOS开发案例:【<b class='flag-5'>首选项</b>】

    如何设置Xilinx ISE首选项11.x 12.x的默认值

    可能是一个新手问题,我们有一个配置允许不同版本的附加工具,如modelsim,synplicity。我们想知道是否有办法告诉Xilinx默认使用什么。具体来说,我们有兴趣设置以下值: 首选项
    发表于 11-15 11:29

    查看首选项未保存, 如何保存设置?

    您好,我想把论坛中的帖子看成“平面阅读模式”而不是“线程阅读模式”。所以我转到用户控制面板,编辑配置文件,特性首选项,查看首选项,并将其设置为“平面”,然后单击“保存配置文件”。如果我移动到其他
    发表于 09-11 12:08

    ESP8266/ARDUINO构建H找不到首选项怎么解决?

    大家好!我对运行 Arduino 核心的 ESP32 有一些扎实的经验,并且一直在使用首选项库来存储,你猜对了,首选项,到该平台上的 NVS。这是一个简单而顺利的过程。我正在尝试将我的代码移植到运行
    发表于 02-21 07:44

    HarmonyOS数据管理与应用数据持久(一)

    的形式存储数据,广泛用于应用中的关系型数据的处理,包括一系列的增、删、改、查等接口,开发者也可以运行自己定义的SQL语句来满足复杂业务场景的需要。 三. 通过用户
    发表于 11-01 16:27

    关于MPLAB Harmony中项目恢复和备份选项的具体介绍

    MPLAB Harmony专辑 - 第5集 - MPLAB Harmony中的项目恢复和备份选项
    的头像 发表于 07-08 00:33 ?3162次阅读

    redis持久机制和如何实现持久

    File)。 RDB是Redis默认采用的持久方式,它通过在指定时间间隔内将内存中的数据集快照写入到磁盘的二进制文件中,实现
    的头像 发表于 12-05 10:02 ?742次阅读

    鸿蒙开发接口数据管理:【@ohos.data.preferences (首选项)】

    首选项为应用提供key-value键值型的数据处理能力,支持应用持久轻量级数据,并对其修改和查询。数据
    的头像 发表于 06-10 18:46 ?2601次阅读

    harmony OS NEXT-基本介绍及DevcoStudiop基本使用

    #鸿蒙基本介绍及DevcoStudiop基本使用 1.认识DevcoStudiop工作区 1.1认识工作区 开发节奏: 通过左侧目录找到对应的应用文件,在编辑区进行代码编写,在右侧看预览效果 快捷键
    的头像 发表于 03-26 16:48 ?463次阅读
    <b class='flag-5'>harmony</b> <b class='flag-5'>OS</b> <b class='flag-5'>NEXT-</b>基本介绍及DevcoStudiop基本使用

    harmony OS NEXT-双向数据绑定MVVM以及$$语法糖介绍

    保持同步的机制,当数据发生变化时,UI自动更新;反之,当用于通过UI代码操作修改数据时,数据模型也会同步更新,这种机制简化了开发,减少了手动DOM或UI组件的代码量,举个简单的例子,比
    的头像 发表于 04-29 16:52 ?537次阅读

    harmony-utils之PreferencesUtil,首选项工具类

    harmony-utils之PreferencesUtil,首选项工具类 harmony-utils 简介与说明 [harmony-utils] 一款功能丰富且极易上手的Harmony
    的头像 发表于 07-03 11:42 ?171次阅读

    harmony-utils之PreviewUtil,文件预览工具类

    实用工具类,致力于助力开发者迅速构建鸿蒙应用。其封装的工具涵盖了APP、设备、屏幕、授权、通知、线程间通信、弹框、吐司、生物认证、用户首选项、拍照、相册、扫码、文件、日志、异常捕获、字符、字符串、数字
    的头像 发表于 07-03 11:40 ?171次阅读

    harmony-utils之StrUtil,字符串工具类

    ,致力于助力开发者迅速构建鸿蒙应用。其封装的工具涵盖了APP、设备、屏幕、授权、通知、线程间通信、弹框、吐司、生物认证、用户首选项、拍照、相册、扫码、文件、日志、异常捕获、字符、字符串、数字、集合
    的头像 发表于 07-03 11:32 ?138次阅读