鸿蒙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"),匹配到一样的键,就可以根据键将最新的值更新。

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

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

相关文章

在Spring中如何手动开启事务(使用编程式事务)

这里写自定义目录标题 一、使用 transactionManager1、向容器中注入事务管理器2、使用 transactionManager 提交事务3、测试 二、使用TransactionTemplate1、向容器中注入 TransactionTemplate2、开启事务 一、使用 transactionManager 1、向容器中注入事务管理器 Configurat…

JAVA面试题整理——内存溢出与内存泄露的区别与联系

内存溢出与内存泄露的区别与联系 在前面jvm学习整理的时候其实用过一个简单的例子了解过内存溢出&#xff0c;在jvm内存模型章节下&#xff0c;大家有兴趣的可以去看看&#xff1a;JVM初学 GC_knowwait的博客-CSDN博客 内存溢出 内存溢出&#xff08;out of memory&#xff09…

LSF 任务运行失败,为什么任务状态却为DONE ?

LSF 任务运行失败&#xff0c;为什么任务状态却为DONE &#xff1f; 问题 用户反馈提交任务后&#xff0c;任务仅运行 1&#xff5e;2 秒后就退出&#xff0c;没有正常结束。但通过 bjobs 查看任务&#xff0c;却显示任务状态为 DONE 即正常退出。因此用户怀疑 LSF 有问题&am…

关于ReactV18的页面跳转传参和接收

一、使用路由方式进行传参和接收&#xff08;此处需使用 useNavigate 和 useParams 两个hooks&#xff09; 1 首先需要配置好路由形式如下 :id(参数) { path: "/articleDetail/:id", element: lazyElement(<ArticleDetail />), }, 2 传递参数 使用 useNaviga…

基于51单片机的智能恒温箱设计--数码管显示

一.硬件方案 根据恒温箱控制器的功能要求&#xff0c;并结合对51系列单片机软件编程自由度大&#xff0c;可用编程实现各种控制算法和逻辑控制。所以采用AT89C52作为电路系统的控制核心。按键将设置好的温度值传给单片机&#xff0c;通过温度显示模块显示出来。初始温度设置好…

php redis分布式锁

一&#xff0c;概念 在PHP中实现分布式锁通常可以使用数据库、缓存系统&#xff08;如Redis&#xff09;或者其他中央存储系统来保证在分布式系统中的数据一致性与同步。秒杀下单、抢红包等等业务场景&#xff0c;都需要用到分布式锁。 常规方案大概有七中 方案一&#xff1a;…

C# WinForm —— 34 ToolStrip 工具栏 介绍

1. 简介 工具栏 ToolStrip&#xff0c;一般紧贴在菜单栏下面 2. 属性 属性解释(Name)控件ID&#xff0c;在代码里引用的时候会用到Enabled控件是否启用Dock定义要绑定到容器的控件边框&#xff0c;默认是topAnchor定义某个控件绑定到的容器的边缘。当控件锚定到某个边缘时&a…

基于JSP技术的大学生校园兼职系统

开头语 你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;可以通过文末的联系方式找到我。 开发语言 JSP 数据库 MySQL 技术 JSP JavaBeans 工具 MyEclipse、Tomcat、Navicat 系统展示 首页 学生登录界面 招聘信息界面 论坛中心界面 摘…

Page的基本使用及其原理

Paging的基本使用 1. 添加依赖 首先&#xff0c;在项目的build.gradle中添加Paging库的依赖。 dependencies { implementation androidx.paging:paging-runtime:X.X.0 // 请替换为当前最新版本 } 2. 定义数据源 创建一个数据源类&#xff0c;该类需要继承自PageKeyedDataS…

人工智能发展历程和工具搭建学习

目录 人工智能的三次浪潮 开发环境介绍 Anaconda Anaconda的下载和安装 下载说明 安装指导 模块介绍 使用Anaconda Navigator Home界面介绍 Environment界面介绍 使用Jupter Notebook 打开Jupter Notebook 配置默认目录 新建文件 两种输入模式 Conda 虚拟环境 添…

代码随想录算法训练营day44

题目&#xff1a;322. 零钱兑换、279.完全平方数、139.单词拆分、多重背包 参考链接&#xff1a;代码随想录 322. 零钱兑换 思路&#xff1a;本题同样可以用完全背包问题&#xff0c;背包容量即为amount&#xff0c;物品weight和value都为硬币coins&#xff0c;需要求的是装…

Python使用ElementTree解析xml的方法

解析XML xml.etree.ElementTree是Python标准库中用于处理XML的模块 可以通过以下语句引入 import xml.etree.ElementTree as ET解析xml时&#xff0c;可以从文件中导入&#xff0c;也可以从string获取 例如&#xff1a; # 从字符串中导入 xml_string <root><eleme…

vue国际化(中英文切换)

思路&#xff1a; 构建了一个 VueI18n 的实例&#xff0c;明确了默认与备用语言及对应的语言包。在组件中获取组件实例以方便后续操作&#xff0c;设置一个点击事件实现语言切换并触发重新获取消息的动作&#xff0c;ref 创建的 msg 用于存储消息内容&#xff0c;设置一个函数…

C++学习(19)

#学习自用# 宏 当我们编译C文件时&#xff0c;首先预处理器会过一遍所有带# 的语句&#xff08;预编译指令符号&#xff09;&#xff0c;然后进行文本替换。 #include<iostream> using namespace std; #define SQUARE(X) X*Xint main() {int a SQUARE(5);cout <&…

linux-awk分析指令

目录 基本用法: 条件语句: 内置变量: 自定义分隔符: 数学运算: 使用多个文件: 生成“完整使用报告”的示例: 8. 模式匹配 9. BEGIN和END模式 10. 数组和关联数组 11. 脚本方式使用 12. 逐行处理 13. 控制语句 awk 是一个强大的文本处理工具&#xff0c;用于在文本…

路虽远,行则将至 - 附暑期实习、秋招历程经验分享

前言 大家好 许久没有时间静下心来打开编辑器写文章了 忙碌暂过&#xff0c;难得一闲时 求学三年&#xff0c;终到离别时 回忆过往&#xff0c;枯燥且多彩 有一点经验&#xff0c;以文字形式分享&#xff0c;希望帮助到大家 可能是这段时间事多且杂&#xff0c;加上很长一…

电脑桌面上用来记事的便签软件

便签软件已成为我们日常生活中不可或缺的记录工具。想象一下&#xff0c;在繁忙的工作中&#xff0c;你突然需要记下一个重要事项或临时想法&#xff0c;这时&#xff0c;一个便捷、高效的便签软件就显得尤为重要。它能帮助我们迅速捕捉信息&#xff0c;轻松管理琐碎事务&#…

LINUX 安装JAVA

安装上传下载 yum -y install lrzsz 建存放目录 mkdir /source mkdir /source/java 进入目录&#xff0c;拖拉上传JDK 解压 tar -zxvf jdk-8u261-linux-x64.tar.gz 配置 vi /etc/profile 在末尾添加以下配置 export JAVA_HOME/source/java/jdk1.8.0_261 export JRE…

通信设备的网卡

一、网卡的作用 将计算机或者路由器连接到传输介质上的接口&#xff0c;传输介质可以是有线也可以是无线的。 &#xff08;1&#xff09;计算机的网卡 现在的计算机大多有两个网卡&#xff0c;一个是有线网卡一个无线网卡&#xff0c;比如以我们的台式电脑为例 台式电脑千兆网…

【氵】Archlinux+KDE Plasma 6+Wayland 安装nvidia驱动 / 开启HDR

参考: NVIDIA - Arch Linux 中文维基 &#xff08;其实就是把 wiki 简化了一下 注&#xff1a;本教程适用 GeForce 930 起、10 系至 20 系、 Quadro / Tesla / Tegra K-系列以及更新的显卡&#xff08;NV110 以及更新的显卡家族&#xff09;&#xff0c;此处以 RTX3060 为例 …