鸿蒙通过用户首选项实现数据持久化
鸿蒙通过用户首选项实现数据持久化
1.1 场景介绍
用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。当用户希望有一个全局唯一存储的地方,可以采用用户首选项来进行存储。Preferences会将该数据缓存在内存中,当用户读取的时候,能够快速从内存中获取数据,当需要持久化时可以使用flush接口将内存中的数据写入持久化文件中。Preferences会随着存放的数据量越多而导致应用占用的内存越大,因此,Preferences不适合存放过多的数据,也不支持通过配置加密,适用的场景一般为应用保存用户的个性化设置(字体大小,是否开启夜间模式)等。
2.1 运作机制
用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。当用户希望有一个全局唯一存储的地方,可以采用用户首选项来进行存储。Preferences会将该数据缓存在内存中,当用户读取的时候,能够快速从内存中获取数据,当需要持久化时可以使用flush接口将内存中的数据写入持久化文件中。Preferences会随着存放的数据量越多而导致应用占用的内存越大,因此,Preferences不适合存放过多的数据,也不支持通过配置加密,适用的场景一般为应用保存用户的个性化设置(字体大小,是否开启夜间模式)等。
- 每个key的value的长度最大为8kb
- 创建首选项-仓库的概念-应用可以有N个仓库,一个仓库中可以有N个key
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的一个环境,这个东西如果想要获取分两种情况-
在ability中区获取 在
onWindowStageCreate
写入这行代码即可MyPreferenceClass.context = this.context
-
在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%')}
相关文章:
鸿蒙通过用户首选项实现数据持久化
鸿蒙通过用户首选项实现数据持久化 1.1 场景介绍 用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。当用户希望有一个全局唯一存储的地方,可以采用用户首选项来进行存储。Preferences会将该…...
数字图像相关(DIC)技术用于生物力学和生物材料测试
生物医学工程是一个跨学科科学领域,旨在改善人类健康和医疗护理。从工程的角度来看,生物材料、力生物学和生物制造与目标生物系统的相互作用,以实现各种医学治疗目的。数字图像相关(DIC)技术,作为一种非接触、精准高效、无损的全场…...
java8中young gc的垃圾回收器选型,您了解嘛
在 Java 8 的 Young GC(新生代垃圾回收)场景中,对于 ToC的场景,即需要尽可能减少垃圾回收停顿时间以满足业务响应要求的场景,以下几种收集器各有特点,通常 Parnew和 G1 young表现较为出色,下面详…...
【五.LangChain技术与应用】【13.LangChain与智普大模型接入:行业领先的AI整合】
当LangChain遇到智普大模型:拆解一个AI整合的超级方案 最近半年,我一直在跟几个创业团队合作搞AI落地项目,发现一个特别有意思的现象:现在企业想用大模型干点实事,最大的痛点反而不是模型本身的能力,而是怎么把模型"塞"进现有系统里,还要塞得优雅、塞得高效。…...
【 <一> 炼丹初探:JavaWeb 的起源与基础】之 Servlet 与 JSP 的协作:MVC 模式的雏形
<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、Servl…...
NO1.C++语言基础|四种智能指针|内存分配情况|指针传擦和引用传参|const和static|c和c++的区别
1. 说⼀下你理解的 C 中的四种智能指针 智能指针的作用是管理指针,可以避免内存泄漏的发生。 智能指针就是一个类,当超出了类的作用域时,就会调用析构函数,这时就会自动释放资源。 所以智能指针作用的原理就是在函数结束时自动释…...
【第14节】C++设计模式(行为模式)-Strategy (策略)模式
一、问题的提出 Strategy 模式:算法实现与抽象接口的解耦 Strategy 模式和 Template 模式要解决的问题是相似的,都是为了将业务逻辑(算法)的具体实现与抽象接口解耦。Strategy 模式通过将算法封装到一个类(Context&am…...
《挑战你的控制力!开源小游戏“保持平衡”开发解析:用HTML+JS+CSS实现物理平衡挑战》
📌 大家好,我是智界工具库,致力于分享好用实用且智能的软件以及在JAVA语言开发中遇到的问题,如果本篇文章对你有所帮助请帮我点个小赞小收藏吧,谢谢喲!😘😘😘 博主声…...
计算机数据库三级刷题总结(博主89分已过,总结的内容分享)
计算机数据库三级刷题总结(博主89分已过,总结的内容分享) 文章目录 计算机数据库三级刷题总结(博主89分已过,总结的内容分享)一、 数据库设计阶段二、事务相关三、数据库设计顺序四、数据库三级模式与二层映…...
鸿蒙HarmonyOS-Navagation基本用法
Navagation基本用法 Navigation组件是路由导航的根视图容器,一般作为Page页面的根容器使用,其内部默认包含了标题栏,内容栏和公工具栏,其中内容区默认首页显示导航内容(Navigation的子组件)或非首页显示&am…...
AD学习-最小系统板,双层
第一章 简单电阻容模型的创建 捕捉栅格在摆放器件时,一般设置成 10mil。移动器件时一般设置成100mil。 比如绘制电容的原理图库,直接就是两根线条竖着成电容, 按Tab键进行颜色变更,按shift键拖动会复制一个出来。 …...
【一.大模型认知与核心原理篇】【3. GPT解密:大模型背后的核心技术】
各位科技爱好者,今天咱们要干一票大的——把GPT这个AI界的当红顶流扒个底朝天。你以为ChatGPT会聊天就是它的全部能耐?Too young!这货肚子里藏的可是价值百亿美金的黑科技。咱们不整那些虚头巴脑的概念,直接上手拆解它的技术内脏,让你看看这个每天被调戏的聊天机器人,到底…...
说一下SpringBoot3新特新和JDK17新特性
JDK1.8(Java8)新特性 stream流式编程 流处理 Stream API 提供了对集合数据进行操作的一种高效、简洁的方式。它支持顺序和并行的聚合操作 如:过滤(filter)、排序(sort)、映射(map&…...
二、Visual Studio2022配置OpenGL环境
文章目录 一、OpenGL库的下载二、OpenGL环境配置三、测试代码演示 一、OpenGL库的下载 OpenGL配置的库是GLFWGLAD ,GLFW 主要用于创建 OpenGL 窗口和管理输入;GLAD 主要用于加载 OpenGL 函数 GLFW下载地址 下载Windows的32bit版本即可。 下载完成解压如…...
可视化编辑器选择
可视化页面编辑器选择 最近要开发一个低代码项目,一个低代码项目技术难点都在可视化编辑器上面,由于没有充足的时间,也没有可视化页面编辑器开发技术能力,因此找到一个靠谱的可视化编辑器,基本就成功了一半。 需求 …...
tomcat的安装与配置(包含在idea中配置tomcat)
Tomcat 是由 Apache 软件基金会开发的开源 Java Web 应用服务器,主要用于运行 Servlet 和 JSP(JavaServer Pages)程序。它属于轻量级应用服务器,适用于中小型系统及开发调试场景,尤其在处理动态内容(如 Jav…...
【编写UI自动化测试集】Appium+Python+Unittest+HTMLRunner
简介 获取AppPackage和AppActivity 定位UI控件的工具 脚本结构 PageObject分层管理 HTMLTestRunner生成测试报告 启动appium server服务 以python文件模式执行脚本生成测试报告 下载与安装 下载需要自动化测试的App并安装到手机 获取AppPackage和AppActivity 方法一 有源码的…...
递归入手三维动态规划
一和零 https://leetcode.cn/problems/ones-and-zeroes/description/ 题目解析 由递归入手, 就是一颗选和不选的树, 我们很好通过 dfs 来写出递归 题目解析 public class 一和零 {public static int zeros;public static int ones;public int findMaxForm(String[] strs, …...
Vue中实现大文件的切片并发下载和下载进度展示
Vue中实现大文件的切片下载 切片下载需要后端提供两个接口,第一个接口用来获取当前下载文件的总切片数,第二个接口用来获取具体某一个切片的内容。 界面展示 数据流展示 代码 接口 // 切片下载-获取文件的总切片数 export function getChunkDownload…...
行为模式---命令模式
概念 命令模式是一种行为设计模式,它的核心思想就是将请求封装为一个对象,此对象包含与请求相关的所有信息。可以用不同的请求对客户进行参数化。命令模式通过将请求的发送者和接收者解耦,支持请求的排队、记录、撤销等操作。 使用场景 1、…...
GNU Binutils 全工具指南:从编译到逆向的完整生态
1. GNU Binutils 全工具指南:从编译到逆向的完整生态 1. GNU Binutils 全工具指南:从编译到逆向的完整生态 1.1. 引言1.2. 工具分类速查表1.3. 核心工具详解 1.3.1. 编译与汇编工具 1.3.1.1. as(汇编器)1.3.1.2. gcc(…...
【手撕算法】支持向量机(SVM)从入门到实战:数学推导与核技巧揭秘
摘要 支持向量机(SVM)是机器学习中的经典算法!本文将深入解析最大间隔分类原理,手撕对偶问题推导过程,并实战实现非线性分类与图像识别。文中附《统计学习公式手册》及SVM调参指南,助力你掌握这一核心算法…...
[QT]开发全解析:从概念到实战
文章目录 Qt 框架入门与应用开发指南一、Qt 框架概述1.1 什么是 Qt1.2 Qt 的发展史1.3 Qt 支持的平台1.4 Qt 版本1.5 Qt 的优点1.6 Qt 的应用场景1.7 Qt 的成功案例 二、Qt 的开发工具概述Qt CreatorVisual StudioEclipse 三、认识 Qt Creator3.1 Qt Creator 概览3.2 使用 Qt C…...
进程控制 ─── linux第15课
目录 进程控制 1.进程创建 (fork前面讲过了) 写时拷贝 进程终止 进程退出场景 退出码 进程终止方法 进程控制 1.进程创建 (fork前面讲过了) 在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父…...
uniapp:小程序将base64图片字符串保存到手机相册
一、需求分析 用户提供的是Base64格式的图片数据,而小程序保存图片到本地通常需要的是临时文件路径。 第一步可能需要将Base64数据转换成临时文件,然后再保存到手机相册。 第二步查阅UniApp的文档,关于保存图片到相册的相关API,…...
宇树科技再落一子!天羿科技落地深圳,加速机器人创世纪
2025年3月5日,机器人行业龙头宇树科技(Unitree)在深圳再添新动作——全资子公司深圳天羿科技有限公司正式成立。这家注册资本10万元、法定代表人周昌慧的新公司,聚焦智能机器人研发与销售,标志着宇树科技在华南市场的战…...
个推助力小米米家全场景智能生活体验再升级
当AI如同水电煤一般融入日常,万物互联的图景正从想象照进现实。作为智能家居领域的领跑者,小米米家凭借开放的生态战略,已连接了超8.6亿台设备,构建起全球领先的消费级AIoT平台。如今,小米米家携手个推,通过…...
四款GIS工具箱软件解析:满足企业多样化空间数据需求
概述 随着地理信息系统(GIS)在城市规划、环境监测、资源管理等领域的广泛应用,各种GIS工具箱软件不断涌现,为用户提供了强大的数据处理、空间分析和地图制图功能。本文将为大家介绍4款GIS工具箱软件,这些软件各具特色…...
Deepseek×ComfyUI革命性工作流:AI图像3倍速精修实战指南
一、为什么选择深度优化的AI精修方案(H2) 核心关键词:AI图像优化工作流、ComfyUI加速方案、Deepseek节点配置 ▸ 传统Stable Diffusion耗时痛点分析(渲染时间/显存占用) ▸ 深度神经网络的并行计算优势对比ÿ…...
IntelliJ IDEA 2024.3.4 版本无法正常加载maven项目
报错如下: Possible solutions: - Check that Maven settings.xml does not contain http repositories - Check that Maven pom files do not contain http repository http://192.168.22.76:9003/repository/thirdparty/ - Check that Maven pom files do not co…...
为什么过滤器需要一个 Wrapper 来 extends HttpServletRequestWrapper
为什么过滤器需要一个 Wrapper 来 extends HttpServletRequestWrapper 1. HttpServletRequest 不可直接修改2. 能够修改请求参数和请求体3. 方便扩展与重用4. 处理请求参数和请求体5. 避免对原始请求做修改 典型使用场景举个例子总结 在 Java Web 开发中,过滤器&…...
SpaCy处理NLP的详细工作原理及工作原理框图
spaCy处理NLP的详细工作原理及工作原理框图 spaCy处理NLP的详细工作原理 spaCy是一个基于Python的开源自然语言处理(NLP)库,它提供了一系列高效且易用的工具,用于执行各种NLP任务,如文本预处理、文本解析、命名实体识…...
数学软件Matlab下载|支持Win+Mac网盘资源分享
如大家所了解的,Matlab与Maple、Mathematica并称为三大数学软件。Matlab应用广泛,常被用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域。 Matlab将数值分析、矩阵计算、科学…...
OCPP与ISO 15118集成:实现即插即充与车网互动(V2G)- 慧知开源充电桩平台
OCPP与ISO 15118集成:实现即插即充与车网互动(V2G) 引言 随着电动汽车(EV)与电网双向能量交互(V2G)技术的成熟,OCPP协议与ISO 15118标准的协同成为智能充电基础设施的核心挑战。本文…...
【C++设计模式】第七篇:桥接模式(Bridge)
注意:复现代码时,确保 VS2022 使用 C17/20 标准以支持现代特性。 抽象与实现的解耦之道 1. 模式定义与用途 核心思想 桥接模式:将抽象部分与实现部分分离,使二者可以独立变化。关键用途: 1.拆分复杂继承…...
【SA8155】AIS Camera流程简述
目录 1 AIS Camera流程之初始化 2 AIS Camera流程之opencamera 3 AIS Camera流程之request处理流程 高通QNX车载系统 + LA虚拟机下Camera框图如下: 高通车载系统中,如上述框图所述,模组驱动在QNX侧,Android侧需要通过HAB Socket通信获取相机的数据。ais_v4l2_proxy将获取…...
容器 /dev/shm 泄漏学习
容器 /dev/shm 泄漏的介绍 在容器环境中,/dev/shm 是一个基于 tmpfs 的共享内存文件系统,通常用于进程间通信(IPC)和临时数据存储。由于其内存特性,/dev/shm 的大小是有限的,默认情况下 Docker 容器的 /de…...
【Deepseek基础】--3.版本对比
目录 1.Deepseek-v1:起步与编码强劲 2. DeepSeek-V2:性能提升与开源生态 3.DeepSeek-V2.5系列:数学与网络搜索突破 4.DeepSeek-R1-Lite系列:推理模型预览版上线 5. DeepSeek-V3系列:大规模模型与推理速度提升 6…...
一周学会Flask3 Python Web开发-WTForms表单验证
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 我们可以通过WTForms表单类属性的validators属性来实现表单验证。 常用的WTForms验证器 验证器说明DataRequired(messageNo…...
算法题笔记(自用)——Python
目录 一. 进制&位运算&ASCAII 二. format格式化输出 1. 基本用法 2. 位置参数 3. 格式化数字 4. 对齐和填充 5. 格式化二进制、八进制、十六进制 6. 格式化百分比 7. 格式化科学计数法 8. 格式化字符串字面量(f-string) 三. 字符串 使…...
Fiji图像处理
文章目录 一、Fiji —— 基于 imageJ 的免费且开源的图像处理软件1.1、工具安装(免费)1.2、源码下载(免费) 二、功能详解2.0、Fiji - ImageJ(Web应用程序)2.1、常用功能(汇总)2.2、F…...
【数据结构】堆和priority_queue
堆的定义 堆是什么?实际上堆是一种特殊的(受限制的)完全二叉树,它在完全二叉树的基础上要求每一个节点都要大于等于或者小于等于它的子树的所有节点。这个大于小于体现在节点的值或者权重。 如图所示: 根节点大于等于…...
Vue的简单入门 三
目录 侦听器 watch 注意 表单输入绑定 v-model v-model修饰符编辑 lazy number Trim 模板引用 组件组成 组件引用三步走 组件的嵌套关系 header Main Aside Aritice Item App.vue组件引入三个子组件 组件的注册方式 全局注册组件的方法 (1) Vue 2 语…...
kotlin的val声明的变量是常量吗
kotlin的val声明的变量是常量吗 DeepSeek R1 思考 65 秒 思考过程 嗯,用户问的是Kotlin中的val声明的变量是不是常量。首先我需要回忆一下Kotlin的基础知识。记得在Kotlin里,val用来声明只读变量,也就是说一旦赋值之后就不能再重新赋值了。…...
C# | 委托 | 事件 | 异步
委托(Delegate)和事件(Event) 在C#和C中,委托(Delegate)与事件(Event)以及函数对象(Function Object)是实现回调机制或传递行为的重要工具。虽然…...
算法日记33:14届蓝桥C++B冶炼金属(二分答案)
一、题目: 二、题解: 1、思路解析: 1)首先我们可以发现题目的样例数量为( n < 1000 n<1000 n<1000),因此我们可以考虑 O ( n ∗ l o g n ) O(n*log^n) O(n∗logn)时间复杂度的算法 …...
【YOLO V5】目标检测 WSL2 AutoDL VScode SSH
【YOLO V5】目标检测 WSL2 AutoDL VScode SSH 前言整体思路理解向YOLO 目标检测完整流程 环境配置Anaconda 获取 YOLO 代码与预训练模型下载 YOLOv5 代码和预训练模型配置 YOLOV5 工程环境解压 YOLOv5 源代码 并 添加预训练模型调整依赖版本选择对应的 Python 解释器 数据集准备…...
前端基础之ajax
vue-cli配置代理服务器解决跨域问题 我们可以使用一个代理服务器8080,Vue项目8080发送请求向代理服务器8080发送请求,再由在理服务器转发给后端服务器 首先需要在vue.config.js中配置代理服务器 const { defineConfig } require(vue/cli-service) modul…...
vscode离线配置远程服务器
目录 一、前提 二、方法 2.1 查看vscode的commit_id 2.2 下载linux服务器安装包 2.3 安装包上传到远程服务器,并进行文件解压缩 三、常见错误 Failed to set up socket for dynamic port forward to remote port(vscode报错解决方法)-C…...
C语言——string.h下的特殊库函数
string.h下的特殊函数 strtok(分割字符串)strerror(错误码信息)memcpy(拷贝)memmove(拷贝)memset(设置内存)memcmp(比较大小) strtok(分割字符串) char * strtok ( char * str, const char * s…...