鸿蒙Next持久化存储PersistentStorage用法总结

news/2024/12/12 9:54:33/文章来源:https://www.cnblogs.com/freerain/p/18601636

一、概述

PersistentStorage是应用程序中的可选单例对象,用于持久化存储选定的AppStorage属性,确保这些属性在应用程序重新启动时的值与关闭时相同。它将属性保留在设备磁盘上,UI和业务逻辑通过AppStorage访问其属性,AppStorage中的更改会自动同步到PersistentStorage,二者建立双向同步。

二、限制条件

  1. 允许的类型和值
    • 简单类型如number、string、boolean、enum等。
    • 可被JSON.stringify()和JSON.parse()重构的对象(成员方法不支持持久化)。
    • API12及以上支持Map、Set、Date类型,以及undefined和null、联合类型。
  2. 不允许的类型和值
    • 不支持嵌套对象(对象数组、对象属性为对象等),因框架无法检测其值变化,无法写回PersistentStorage。
  3. 性能相关限制
    • 持久化数据相对缓慢,应避免持久化大型数据集和经常变化的变量。建议持久化变量小于2kb,大量数据持久化会影响UI渲染性能,如需存储大量数据,建议使用数据库API。
  4. 调用时机限制
    • 持久化操作需在UI实例初始化成功(loadContent传入的回调被调用时)后才可调用,早于该时机调用会导致持久化失败。

三、使用场景

(一)从AppStorage中访问PersistentStorage初始化的属性

  1. 初始化PersistentStorage
    • 使用PersistentStorage.persistProp('aProp', 47);初始化属性。
  2. 在AppStorage获取对应属性
    • 可以通过AppStorage.get<number>('aProp');获取,或在组件内部使用@StorageLink('aProp') aProp: number = 48;定义双向绑定变量。
    • 新应用安装后首次启动运行时,会依次查询PersistentStorage本地文件和AppStorage中是否存在属性,若不存在则创建并初始化,然后将属性持久化。之后在组件中创建双向绑定变量时会使用AppStorage中的值。
    • 触发点击事件等改变绑定变量时,变化会同步到AppStorage,进而触发PersistentStorage将新值写入磁盘。后续启动应用时,会先从PersistentStorage查询值并写入AppStorage,组件中的绑定变量获取到相应值。

(二)在PersistentStorage之前访问AppStorage中的属性(反例)

  • 例如let aProp = AppStorage.setOrCreate('aProp', 47);PersistentStorage.persistProp('aProp', 48);这种调用顺序会导致问题。在非首次运行时,先执行AppStorage.setOrCreate('aProp', 47)会创建属性并写回PersistentStorage,导致之前存储的值丢失,然后PersistentStorage.persistProp('aProp', 48)会使用新创建的值。

(三)在PersistentStorage之后访问AppStorage中的属性

  • 开发者可先判断是否需要覆盖上一次保存在PersistentStorage中的值,如PersistentStorage.persistProp('aProp', 48);if (AppStorage.get('aProp') > 50) { AppStorage.setOrCreate('aProp',47); },根据判断结果决定是否调用AppStorage接口修改值。

(四)支持联合类型

  • 例如PersistentStorage.persistProp("P", undefined);初始化属性为undefined,然后在组件中通过@StorageLink("P") p: number | undefined | null = 10;绑定变量,点击按钮改变变量值时,视图会刷新且值被持久化存储。

(五)装饰Date类型变量

  • 使用PersistentStorage.persistProp("persistedDate", new Date());初始化Date类型属性,在组件中通过@StorageLink("persistedDate") persistedDate: Date = new Date();绑定变量,点击按钮更新Date值时,视图刷新且值被持久化存储,可通过相关接口获取Date的具体信息(如年月日、时间等)并显示。

(六)装饰Map类型变量

  • PersistentStorage.persistProp("persistedMapString", new Map<number, string>([]));初始化Map类型属性,组件中通过@StorageLink("persistedMapString") persistedMapString: Map<number, string> = new Map<number, string>([]);绑定变量,点击按钮改变Map值(如添加键值对)时,视图刷新且值被持久化存储,可通过循环遍历显示Map中的元素。

(七)装饰Set类型变量

  • PersistentStorage.persistProp("persistedSet", new Set<number>([]));初始化Set类型属性,组件中通过@StorageLink("persistedSet") persistedSet: Set<number> = new Set<number>([]);绑定变量,点击按钮改变Set值(如添加元素、清空集合)时,视图刷新且值被持久化存储,可通过循环遍历显示Set中的元素。

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

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

相关文章

转载:【AI系统】模型剪枝

本文将介绍模型剪枝的概念、方法和流程,这是一种通过移除神经网络中的冗余或不重要参数来减小模型规模和提高效率的模型压缩技术。 剪枝不仅可以减少模型的存储和计算需求,还能在保持模型性能的同时提高模型的泛化能力。我们将探讨剪枝的定义、分类、不同阶段的剪枝流程,以及…

转载:【AI系统】训练后量化与部署

本文将会重点介绍训练后量化技术的两种方式:动态和静态方法,将模型权重和激活从浮点数转换为整数,以减少模型大小和加速推理。并以 KL 散度作为例子讲解校准方法和量化粒度控制来平衡模型精度和性能。 训练后量化的方式 训练后量化的方式主要分为动态和静态两种。 动态离线量…

转载:【AI系统】EfficientNet 系列

本文主要介绍 EfficientNet 系列,在之前的文章中,一般都是单独增加图像分辨率或增加网络深度或单独增加网络的宽度,来提高网络的准确率。而在 EfficientNet 系列论文中,会介绍使用网络搜索技术(NAS)去同时探索网络的宽度(width),深度(depth),分辨率(resolution)对模型准确…

转载:【AI系统】轻量级CNN模型新进展

在本文会接着介绍 CNN 模型的小型化,除了第二篇文章提到的三个模型外,在本文会继续介绍 ESPNet 系列,FBNet 系列,EfficientNet 系列和 GhostNet 系列。 ESPNet 系列 ESPNetV1 ESPNet V1:应用在高分辨图像下的语义分割,在计算、内存占用、功耗方面都非常高效。主要贡献在于…

人工智能大语言模型起源篇(一),从哪里开始

序言:许多人最初接触人工智能都是在ChatGPT火热之际,并且大多停留在应用层面。对于希望了解其技术根源的人来说,往往难以找到方向。因此,我们编写了《人工智能大语言模型起源篇》,旨在帮助读者找到正确的学习路径,了解大型语言模型的大致起源。本文将分为三个部分,介绍当…

火焰监测识别摄像机

火焰识别摄像机是一种可以监测环境中火焰的摄像设备,具有广泛的应用场景,包括但不限于工业厂区、商业建筑、森林防火等领域。这种摄像机可以通过对火焰的热辐射进行识别和分析,及时发现火源并采取相应措施,可以有效减少火灾带来的损失,提高安全性和管理效率。火焰识别摄像…

【最优化方法】第六次要点整理

目录拟牛顿法的思想拟牛顿法的条件拟牛顿法的步骤校正矩阵的确定SR1 校正(对称秩 1 校正)DFP 校正BFGS 算法 拟牛顿法的思想 牛顿法的迭代方程为: \[d_k = - (\nabla^2 f(x_k))^{-1} \nabla f(x_k) \]牛顿法的优缺点:优点:局部二阶收敛,速度快。 缺点:每步都要计算 Hess…

抽烟监测识别摄像机

抽烟识别摄像机是一种利用计算机视觉和人工智能技术的设备,能够实时监测和识别吸烟行为。该摄像机通过分析人体姿态和动作,识别出可能的吸烟行为,并及时发出警告或报警。这种摄像机可以广泛应用于公共场所、办公场所、学校和医疗机构等地方,帮助管理者有效监控吸烟行为,及…

OpenAPI 与 国产 Solon 框架支持,Fast Request 2024.1.9 发布

Fast Request是一个类似于 Postman 的 IDEA 插件。它是一个强大的 restful api 工具包插件,可以根据已有的方法帮助您快速、自动生成 url 和 params。 Restful Fast Request = API 调试工具 + API 管理工具 + API 搜索工具。 它有一个漂亮的界面来完成请求、检查服务器响应、存…

EtherNet/IP 转 Modbus 网关作用下 AB PLC 控制变频器的案例呈现

在工业自动化控制系统中,常常会遇到不同品牌和通信协议的设备需要协同工作的情况。本案例中,客户现场采用了 AB PLC,但需要控制的变频器仅支持 Modbus 协议。为了实现 AB PLC 对变频器的有效控制与监控,引入了捷米特 JM-EIP-RTU 网关来完成 EtherNet/IP 与 Modbus 之间的协…

Qt编写RK3588视频播放器/支持RKMPP硬解/支持各种视音频文件和视频流/海康大华视频监控

一、前言 用ffmpeg做硬解码开发,参考自带的示例hw_decode.c即可,里面提供了通用的dxva2/d3d11va/vaapi这种系统层面封装的硬解码,也就是无需区分用的何种显卡,操作系统自动调度,基本上满足了各种场景的需要,这种方式很通用也便捷,但是一些特殊场景必须要用指定硬解码器名…

apisix~转发到某个静态页

路由转发(也称为请求转发或反向代理)是一个核心功能,它允许将客户端的请求转发到后端服务器。Nginx 广泛用于处理高并发的请求,并能够有效地分配流量和管理负载。以下是关于 Nginx 路由转发的一些基本理论和概念。 反向代理 通常作为反向代理服务器工作,接收来自客户端的请…