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

news/2025/3/24 2:34:47/文章来源:https://www.cnblogs.com/yihonghh/p/18785304

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

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 = falsebuild() {//初始化默认值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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/902508.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

harmony OS NEXT-启动页开发

鸿蒙启动页开发 1.1 更改应用名称和图标 1.更改应用图标找到moudle.json5文件,找到应用启动的EntryAbility下面的icon,将原来的图标改成自己设置的即可2.更改应用名称3.效果展示2.1 广告页面开发3.1 详细介绍 3.1.1 启动页面 import { PrivacyDialog } from ../views/componen…

harmony OS NEXT–状态管理器–@State详解

鸿蒙Harmony--状态管理器--@State详解 1.1 定义 @State装饰的变量,或者称为状态变量,一旦变量拥有了状态属性,就可以触发其直接绑定UI组件的刷新。当状态改变时,UI会发生对应的渲染变化 ,@State装饰的变量,与声明式范式中的其他被装饰变量一样,是私有的,只能从组件内部访问。在…

harmony OS NEXTUI开发

UI开发 1. 布局概述 1.1 开发流程1.先确定开发流程 -> 2.分析页面元素构成 ->3.选用合适的布局容器组件1.3 布局元素组成:盒模型2.1 布局分类 2.1 线性布局线性布局是开发中最常用、最基础的布局,通过线性容器Row和Column构建2.1.1 线性布局子元素排列方向:主轴布局子…

harmony OS NEXT组件结构

组件结构 1. 认识基本的组件结构ArkTS通过装饰器@Component 和@Entry 装饰 struct 关键字声明的数据结构,构成一个自定义组件 自定义组件中提供了一个build函数,开发者需要在函数内以链式调用的方式进行基本的UI描述,UI描述的方法请参考UI描述规范srtuct-自定义组件基于stru…

如何使用 vxe-table 来实现高亮行与高亮列,单元格选择高亮移动功能

如何使用 vxe-table 来实现高亮行与高亮列,单元格选择高亮移动功能 查看官网:https://vxetable.cn gitbub:https://github.com/x-extends/vxe-table gitee:https://gitee.com/x-extends/vxe-table 效果代码 通过 rowConfig.isCurrent 启用高亮行功能,columnConfig.isCurre…

Browser-use探索-webui

UI化的Browser-use 拉项目下来:git clone https://github.com/browser-use/web-ui.git # 拉取项目依次安装依赖:# pip install browser-use# playwright install# pip install -r requirements.txt 重新搞个配置文件.env:OPENAI_ENDPOINT=https://api.openai.com/v1 OPENAI_…

Web 页面实现图片放大镜效果

Web 页面实现图片放大镜效果Web 页面实现图片放大镜效果 下面是一个完整的示例代码: <!DOCTYPE html> <html><head><meta charset="UTF-8" /><title>图片放大镜效果</title><style>.container {position: relative;width…

3.A+B 问题三

用while(hasNext())来判断是非还有输入 后面用if判断结束循环的条件 break 结束循环; continue 跳过本次循环 进入下一次循环

save actions 设置

activate save actions on save – 在保存的时候激活save actions optimize imports – 自动删除没有引用的importsreformat file – 自动格式化代码add missing @Override – 在save actions激活的时候直接提添加overrideadd a serialVersionUID – 自动添加序列化id

同源策略SpringBoot允许跨域请求配置

完全允许(测试环境) import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotat…

【Vscode】用Vscode配置简约方便的Qt环境!

其实本文是在好不容易配好的情况下写成 故进食后人 Qt Creator的那个页面真的好丑 写完上学期大作业 这学期还要写的时候终于受不了了 而且各种报错什么的非常不好用 不知道是在干嘛 毕竟谁不想用舒服的字体 然后再配上麻衣学姐的背景和看板娘写代码呢?() 于是我开始探索怎么…

17.6K star!后端接口零代码的神器来了,腾讯开源的ORM库太强了!

"🏆 实时零代码、全功能、强安全 ORM 库 🚀 后端接口和文档零代码,前端定制返回 JSON 的数据和结构"嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法"🏆 实时零代码、全功能、强安全 ORM 库 🚀 后端接口和文…