当前位置: 首页 > news >正文

鸿蒙HarmonyOS开发 preferences首选项

目录

引言

官方介绍

如何使用

完整示例

监听首选项变化

总结


引言

在鸿蒙开发中,不可避免的需要用到一些简单数据的持久化存储,今天就总结一下鸿蒙开发中的持久化存储库ohos.data.preferences (用户首选项),有过Android原生开发经验的同学会觉得很眼熟,这不就是android的SharePreferences嘛,先卖个关子,往下看

官方介绍

ohos.data.preferences (用户首选项)用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。

数据存储形式为键值对,键的类型为字符串型,值的存储数据类型包括数字型、字符型、布尔型以及这3种类型的数组类型。

注意:Key的最大长度限制为80个字节,Value的最大长度限制为8192个字节。大概2000个字符左右的长度,如果数据多长建议使用文件或轻量型数据库来存储。

如何使用

1、引入ohos.data.preferences的库

import dataPreferences from '@ohos.data.preferences';

2、获取存储实例

//获取存储实例
let store = await dataPreferences.getPreferences(getContext(this), 'store');

3、通过get,put,delete等函数执行数据的 获取,存储,删除操作。

//读取存储值的时候必须提供默认值
await this.store.put('name', 'jay');
await this.store.delete('name');

4、将当前Preferences实例的数据异步存储到用户首选项的持久化文件中

是的,还有最后一步,当调用执行完flush函数,才算真正的将数据存储在用户首选项的持久化文件中。

 await this.store.flush();

完整示例

import dataPreferences from '@ohos.data.preferences';@Entry
@Component
struct PreferencesPage {store: any = {}async aboutToAppear() {//获取存储实例let store = await dataPreferences.getPreferences(getContext(this), 'store');}build() {Row() {Column({ space: 20 }) {Button('数据存储').onClick(async () => {await this.store.put('name', 'jay');//调用数据持久化await this.store.flush();console.log('Preferences:数据存储成功');})Button('读取数据').onClick(async () => {let data = await  this.store.get('name', '不能说的秘密');console.log('Preferences:数据读取成功:' + data);})Button('删除数据').onClick(async () => {await  this.store.delete('name');console.log('Preferences:数据删除成功');})}.width('100%')}.height('100%')}
}

重要:以上所有的函数调用包括获取存储实例,都必须异步调用,否则无法正确存储。

监听首选项变化

重点来了,Preferences为我们提供了,订阅和取消订阅监听首选项,如果我们需要监听某个值的更新,比如有这么一个场景,用户购买物品,需要先去地址列表选择一个地址,常规的做法可能是跳转回的时候吧数据再带回来,但是有了首选项监听我们就轻松很多。

在哪里使用,就在哪里监听:

import router from '@ohos.router'
import dataPreferences from '@ohos.data.preferences';@Entry
@Component
struct AddressPage {store: any = {}@State city: string = ''async aboutToAppear() {//获取存储实例this.store = await dataPreferences.getPreferences(getContext(this), 'store');//开启数据监测this.store.on('change', async key => {if (key == 'city') {//读取数据this.city = await this.store.get('city', '');console.log('Preferences:数据读取成功');}})}build() {Row() {Column() {Button(this.city || "请选择").onClick(() => {router.pushUrl({ url: 'pages/AddressListOptionsPage' });})}.width('100%')}.height('100%')}
}

存储数据的页面:

import router from '@ohos.router'
import dataPreferences from '@ohos.data.preferences';@Entry
@Component
struct AddressListOptionsPage {options: Array<string> = ['北京', '上海', '广州']store: any = {}async aboutToAppear() {//获取存储实例this.store = await dataPreferences.getPreferences(getContext(this), 'store');}build() {Row() {Column({ space: 20 }) {ForEach(this.options, (item) => {Button(item).onClick(async () => {await this.store.put('city', item);await this.store.flush();console.log('Preferences:数据存储成功');router.back();})})}.width('100%')}.height('100%')}
}

最后选中的结果成功展示在了按钮上。

总结

preferences首选项带给我最大的惊喜就是可以订阅更新,这个非常实用,我们不需要像以往在每个要用到值的地方更新了,我们只需要订阅on("change"),匹配到一样的键,就可以根据键将最新的值更新。

相关文章:

  • ARM 汇编 C语言 for循环
  • 【设计模式深度剖析】【8】【行为型】【备忘录模式】| 以后悔药为例加深理解
  • 为什么说Python 是胶水语言?
  • C# OpenCvSharp 代数运算-add、scaleAdd、addWeighted、subtract、absdiff、multiply、divide
  • 大型企业IT基础架构和应用运维体系
  • 基于Java的诊所医院管理系统,springboot+html,MySQL数据库,用户+医生+管理员三种身份,完美运行,有一万一千字论文
  • 【DevOps】Logstash详解:高效日志管理与分析工具
  • macOS Sequoia 将 Mac 生产力与智能化提升至全新高度 (macOS 15 ISO、IPSW、PKG 下载)
  • 69. UE5 RPG 使用Gameplay Cue 实现技能表现效果
  • 9M高速USB转接芯片CH347转双串口转I2C转SPI转JTAG转SWD
  • Linux内核中的锁
  • 判断QT程序是否重复运行
  • Qt自定义日志输出
  • 【MySQL】索引(上)
  • 如何连接达梦数据库?
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • KMP算法及优化
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • vuex 笔记整理
  • 从PHP迁移至Golang - 基础篇
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 蓝海存储开关机注意事项总结
  • 免费小说阅读小程序
  • 面试遇到的一些题
  • 前端之Sass/Scss实战笔记
  • 容器服务kubernetes弹性伸缩高级用法
  • 使用权重正则化较少模型过拟合
  • 详解NodeJs流之一
  • # 数据结构
  • #100天计划# 2013年9月29日
  • #LLM入门|Prompt#3.3_存储_Memory
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (LLM) 很笨
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (二) 初入MySQL 【数据库管理】
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (规划)24届春招和25届暑假实习路线准备规划
  • (三)终结任务
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)甲方乙方——赵民谈找工作
  • (转)人的集合论——移山之道
  • ******之网络***——物理***
  • .NET 4.0中的泛型协变和反变
  • .net 7 上传文件踩坑
  • .NET CLR Hosting 简介
  • .net 获取某一天 在当月是 第几周 函数
  • .NET开发者必备的11款免费工具
  • .NET中统一的存储过程调用方法(收藏)
  • //usr/lib/libgdal.so.20:对‘sqlite3_column_table_name’未定义的引用
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解