OpenHarmony 持久化存储 UI 状态:PersistentStorage

news2025/1/11 19:51:46

前两个小节介绍的 LocalStorage 和 AppStorage 都是运行时的内存,但是在应用退出再次启动后,依然能保存选定的结果,是应用开发中十分常见的现象,这就需要用到 PersistentStorage。

PersistentStorage 是应用程序中的可选单例对象。此对象的作用是持久化存储选定的 AppStorage 属性,以确保这些属性在应用程序重新启动时的值与应用程序关闭时的值相同。

概述

PersistentStorage 将选定的 AppStorage 属性保留在设备磁盘上。应用程序通过 API,以决定哪些 AppStorage 属性应借助 PersistentStorage 持久化。UI 和业务逻辑不直接访问 PersistentStorage 中的属性,所有属性访问都是对 AppStorage 的访问,AppStorage 中的更改会自动同步到 PersistentStorage。

PersistentStorage 和 AppStorage 中的属性建立双向同步。应用开发通常通过 AppStorage 访问 PersistentStorage,另外还有一些接口可以用于管理持久化属性,但是业务逻辑始终是通过 AppStorage 获取和设置属性的。

限制条件

持久化数据是一个相对缓慢的操作,应用程序应避免以下情况:

● 持久化大型数据集。

● 持久化经常变化的变量。

PersistentStorage 的持久化变量最好是小于 2kb 的数据,不要大量的数据持久化,因为 PersistentStorage 写入磁盘的操作是同步的,大量的数据本地化读写会同步在 UI 线程中执行,影响 UI 渲染性能。如果开发者需要存储大量的数据,建议使用数据库 api。

PersistentStorage 和 UIContext 相关联,需要在UIContext明确的时候才可以调用,可以通过在runScopedTask里明确上下文。如果没有在 UIContext 明确的地方调用,将导致无法持久化数据。

使用场景

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

1.初始化 PersistentStorage:

PersistentStorage.persistProp('aProp', 47);

2.在 AppStorage 获取对应属性:

AppStorage.get<number>('aProp'); // returns 47

或在组件内部定义:

@StorageLink('aProp') aProp: number = 48;

完整代码如下:

PersistentStorage.persistProp('aProp', 47);

@Entry
@Component
struct Index {
  @State message: string = 'Hello World'
  @StorageLink('aProp') aProp: number = 48

  build() {
    Row() {
      Column() {
        Text(this.message)
        // 应用退出时会保存当前结果。重新启动后,会显示上一次的保存结果
        Text(`${this.aProp}`)
          .onClick(() => {
            this.aProp += 1;
          })
      }
    }
  }
}

● 新应用安装后首次启动运行:

○ 调用 persistProp 初始化 PersistentStorage,首先查询在 PersistentStorage 本地文件中是否存在“aProp”,查询结果为不存在,因为应用是第一次安装。

○ 接着查询属性“aProp”在 AppStorage 中是否存在,依旧不存在。

○ 在 AppStorge 中创建名为“aProp”的 number 类型属性,属性初始值是定义的默认值 47。

○ PersistentStorage 将属性“aProp”和值 47 写入磁盘,AppStorage 中“aProp”对应的值和其后续的更改将被持久化。

○ 在 Index 组件中创建状态变量 @StorageLink('aProp') aProp,和 AppStorage 中“aProp”双向绑定,在创建的过程中会在 AppStorage 中查找,成功找到“aProp”,所以使用其在 AppStorage 找到的值 47。

图 1 PersistProp 初始化流程 

● 触发点击事件后:

○ 状态变量 @StorageLink('aProp') aProp 改变,触发 Text 组件重新刷新。

○ @StorageLink 装饰的变量是和 AppStorage 中建立双向同步的,所以 @StorageLink('aProp') aProp 的变化会被同步回 AppStorage 中。

○ AppStorage 中“aProp”属性的改变会同步到所有绑定该“aProp”的单向或者双向变量,在本示例中没有其他的绑定“aProp”的变量。

○ 因为“aProp”对应的属性已经被持久化,所以在 AppStorage 中“aProp”的改变会触发 PersistentStorage,将新的改变写入本地磁盘。

● 后续启动应用:

○ 执行 PersistentStorage.persistProp('aProp', 47),在首先查询在 PersistentStorage 本地文件查询“aProp”属性,成功查询到。

○ 将在 PersistentStorage 查询到的值写入 AppStorage 中。

○ 在 Index 组件里,@StorageLink 绑定的“aProp”为 PersistentStorage 写入 AppStorage 中的值,即为上一次退出引用存入的值。

在 PersistentStorage 之前访问 AppStorage 中的属性

该示例为反例。在调用 PersistentStorage.persistProp 或者 persistProps 之前使用接口访问 AppStorage 中的属性是错误的,因为这样的调用顺序会丢失上一次应用程序运行中的属性值:

let aProp = AppStorage.setOrCreate('aProp', 47);
PersistentStorage.persistProp('aProp', 48);

应用在非首次运行时,先执行 AppStorage.setOrCreate('aProp', 47):属性“aProp”在 AppStorage 中创建,其类型为 number,其值设置为指定的默认值 47。'aProp'是持久化的属性,所以会被写回 PersistentStorage 磁盘中,PersistentStorage 存储的上次退出应用的值丢失。

PersistentStorage.persistProp('aProp', 48):在 PersistentStorage 中查找到“aProp”,找到,值为 47。

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

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

相关文章

科学指南针XPS | SEM | BET 降价:不赚钱,就和您交个朋友

尊敬的各位客户&#xff1a; 感谢您一直以来对科学指南针服务平台&#xff08;下文简称&#xff1a;科学指南针&#xff09;的支持和信任&#xff01;科学指南针本着服务第一&#xff0c;客户至上的精神&#xff0c;多年来坚持为客户提供高质量的测试和服务&#xff0c;获得了广…

将日志压缩并归档到 Amazon S3 Glacier 存储层中

在分布式架构中&#xff0c;经常需要保存应用程序的日志&#xff0c;对于亚马逊云科技的客户来说&#xff0c;保存通常是通过一个 Amazon S3 桶来完成。这些日志可能包含运行时事务、错误、故障状态、应用程序指标和统计信息。这些日志将被用于商业智能&#xff0c;以提供有用的…

创龙瑞芯微RK3568参数修改(调试口波特率和rootfs文件)

前言 前面写了基本的文件编译、系统编译和系统烧写&#xff0c;差不多前期工作就准备的差不多了。目前的东西能解决大部分入门级的需求。当然如果需要开发的话&#xff0c;还需要修改其他东西&#xff0c;下面一步一步的给小伙伴介绍关键参数怎么修改。 给定波特率 拿到开发板…

Stable Diffusion原理

一、Diffusion扩散理论 1.1、 Diffusion Model&#xff08;扩散模型&#xff09; Diffusion扩散模型分为两个阶段&#xff1a;前向过程 反向过程 前向过程&#xff1a;不断往输入图片中添加高斯噪声来破坏图像反向过程&#xff1a;使用一系列马尔可夫链逐步将噪声还原为原始…

【全国大学生loT设计竞赛】安谋科技灵动赛题国二分享:MagicDog—仿生狗四足机器人

本文参加极术社区和灵动微电子组织的2022全国大学生物联网设计作品征集活动。 “全国大学生物联网设计竞赛”是以促进国内物联网相关专业建设和人才培养为目标&#xff0c;以物联网技术为核心&#xff0c;激发物联网相关专业学生的创造、创新、创业活力&#xff0c;推动高校创新…

服装行业如何做数字化转型?

服装行业如何做数字化转型&#xff1f; &#xff08;一&#xff09;明确定位 企业在开启数字化转型之旅前&#xff0c;需要"认清自我&#xff0c;明确定位&#xff0c;持续创新"。厚鸟科技有企业数字化转型成熟度的指标定义&#xff0c;帮助企业进行综合评估&#…

java 对接微信支付Native下单API报错: java.security.InvalidKeyException: Illegal key size

受到美国法律的约束&#xff0c;早期Java的运行时限制了JCE支持的密钥长度&#xff0c;即默认不支持256位的AES。解决的方法有三个&#xff1a; 1、&#xff08;推荐&#xff09;升级Java 8u162&#xff0c;默认使用ulimited policy 2、Java 8u151和8u152&#xff0c;可以在你的…

赶快收藏不迷路,不允许你还不知道这几个程序员接单平台!!!

作为一个每天和26键打交道的程序员&#xff0c;谁还不想在闲暇之余做点兼职&#xff0c;赚点外快呢&#xff0c;毕竟做人嘛&#xff0c;谁会和钱过不去嘞&#xff0c;但是你是不是还在寻找一个靠谱的线上接单平台&#xff1f;那这几个平台你可要收藏好了&#xff01; NO.1开源众…

axios get请求不能通过body 数据json数据

axios get请求不能通过 body 传递数据&#xff0c;只能用query的方式&#xff0c;post请求传递参数用的是data这个字段&#xff0c;但是看官方文档 Request Config | Axios Docs

一个虚拟机管理器(VMM)的实现

虚拟机管理器又名虚拟机管理程序、虚拟机监控程序、VMM。它使用虚拟化技术&#xff0c;将一台物理机虚拟化为多台虚拟机&#xff0c;每台虚拟机都可以独立一个操作系统。其背后的原理也很简单&#xff0c;它就是一个应用程序&#xff0c;模拟了硬件所提供的功能&#xff0c;比如…

虹科分享 | 赋能物流机器人:CANopen通信如何发挥重要作用?

现代物流领域迅速融入了技术进步&#xff0c;特别是随着自主机器人的兴起&#xff0c;这一趋势越发明显。确保这些机器人在复杂的仓库环境中精确运行的一个关键方面是CANopen通信协议。该协议集成了各种组件&#xff08;电机、传感器、摄像头和先进的电池系统&#xff09;&…

Java基础20问(6-10)

6.Java接口和抽象类的区别&#xff1f; 不同点 1.接口在Java8之前不能写方法实现逻辑&#xff0c;Java8及以后的版本&#xff0c;可以用default关键字写方法的实现。 2.接口中方法都是public的&#xff0c;public可以省略&#xff0c;而抽象类没有这个限制。 3.接口用inter…

防止员工私自拷贝公司资料

公司资料的安全性变得越来越重要&#xff0c;然而&#xff0c;我们时常会面临一个严峻的问题&#xff1a;员工私自拷贝公司资料。这不仅可能导致数据泄露&#xff0c;还会给公司带来巨大的经济损失和声誉风险。因此&#xff0c;采取有效的措施来防止员工私自拷贝公司资料已势在…

台灯护眼灯怎么挑选?央视公认好用的护眼台灯

现在我们的生活被大大小小的屏幕包围着&#xff0c;学生群体也是如此&#xff0c;再家长他们平时学业就比较繁重&#xff0c;无疑是增加了眼睛的负担&#xff0c;这也是如今这么多儿童青少年早早戴上眼镜的原因。所以很多家长也开始重视起了孩子的视力健康问题&#xff0c;都纷…

ChatGPT 即将诞生一周年,OpenAI 将有大动作

图片来源&#xff1a;由无界AI生成 下个月就是 ChatGPT 一周年纪念日。OpenAI 正在谋划新的大动作。可以肯定地说&#xff0c;自诞生以来&#xff0c;ChatGPT 就为 OpenAI 提供了不可阻挡的增长动力。 01 营收超预期&#xff0c;OpenAI 缓了一口气 据 The Information 报道&…

Unity设置Visual Studio后依旧恢复原样

一、背景 小伙伴们在做Unity开发的时候&#xff0c;是否会遇到当设置了Visual Studio 后&#xff0c;下次打开依旧恢复原样的问题呢&#xff1f; 二、解决思路 第一步&#xff1a;首先设置这里的Vs版本 第二步:打开Browse 打开这里的Browse&#xff0c;找到Visual Studio…

哪个品牌的触控笔质量好?触控笔排行榜

想必很多学生党都想为iPad配上一款电容笔&#xff0c;然而无从下手&#xff0c;毕竟原装的Apple Pencil虽然性能很好&#xff0c;但也很贵&#xff0c;不是谁都能负担得起的。所以&#xff0c;有没有类似于Apple Pencil的平替式电容笔&#xff1f;肯定有&#xff0c;国内的平替…

WebStrom对于rpx爆红的解决方法

WebStrom对于rpx爆红的解决方法 问题场景&#xff1a;在使用WebStrom编写CSS样式代码时&#xff0c;经过快捷键格式化后代码CSS变无效了&#xff01; 问题原因&#xff1a;快捷键格式化的锅&#xff08;准确来说是WebStrom的锅&#xff09; WebStrom编译器默认是不支持 rpx 像…

Qt QDialog模式对话框传递数据给主窗口(主窗口->子窗口)

Qt工作笔记-QDialog模式对话框传递数据给主窗口_qt dialog-CSDN博客话不多说&#xff0c;上图&#xff1a;这里同样是采用了Qt的信号与槽机制。项目文件分布如下&#xff1a;代码如下&#xff1a;dialog.h#ifndef DIALOG_H#define DIALOG_H#include <QDialog>namespace U…

苹果手机怎么恢复数据?推荐这款数据恢复软件!

苹果手机一直以高颜值、系统稳定&#xff0c;以及优质的用户体验而闻名&#xff0c;这也使得购买苹果手机的用户逐渐增多。在手机中我们会保存各种各样的数据&#xff0c;包括照片、视频、备忘录、聊天记录等等。但是&#xff0c;这些数据可能会因为某些原因而导致丢失。 那么…