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

一、概述

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.mzph.cn/diannao/64253.shtml

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

相关文章

《Keras3 minist 手写数字AI模型训练22秒精度达到:0.97》

《Keras3 minist 手写数字AI模型训练22秒精度达到&#xff1a;0.97》 一、修改源码加上如下两条代码二、源码修改如下三、Keras3 minist 训练22秒结束&#xff0c;训练过程截图四、Keras3 minist 源码截图 一、修改源码加上如下两条代码 import os os.environ["KERAS_BAC…

LeetCode771 宝石与石头

题目描述 给定一个字符串 jewels&#xff0c;它代表石头中宝石的类型&#xff1b;另有一个字符串 stones&#xff0c;代表我们拥有的石头。其中&#xff0c;stones 里的每个字符对应一种石头类型&#xff0c;任务是要精准地统计出在 stones 当中&#xff0c;属于 jewels 所定义…

MySQL基础大全(看这一篇足够!!!)

文章目录 前言一、初识MySQL1.1 数据库基础1.2 数据库技术构成1.2.1 数据库系统1.2.2 SQL语言1.2.3 数据库访问接口 1.3 什么是MySQL 二、数据库的基本操作2.1 数据库创建和删除2.2 数据库存储引擎2.2.1 MySQL存储引擎简介2.2.2 InnoDB存储引擎2.2.3 MyISAM存储引擎2.2.4 存储引…

[论文阅读笔记]-PalmTree: 学习一个用于指令嵌入的汇编语言模型

深度学习已在众多二进制分析任务中展示了其优势&#xff0c;包括函数边界检测、二进制代码搜索、函数原型推理、值集分析等。现有方案忽略了复杂的指令内结构&#xff0c;主要依赖于控制流&#xff0c;其中上下文信息是嘈杂的&#xff0c;并且可能受到编译器优化的影响。为了解…

手搓一个极简远端git库

原文地址&#xff1a;手搓一个极简远端git库 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 问题分析 公司一直用 gitlab &#xff08;或者 极狐 都是一样的&#xff09;作为代码管理库&#xff0c;但是看了一些文章说代码最小的管理只需要 g…

米哈游大数据面试题及参考答案

怎么判断两个链表是否相交?怎么优化? 判断两个链表是否相交可以采用多种方法。 一种方法是使用双指针。首先分别遍历两个链表,得到两个链表的长度。然后让长链表的指针先走两个链表长度差的步数。之后,同时移动两个链表的指针,每次比较两个指针是否指向相同的节点。如果指…

Linux 服务器下非root用户安装CUDA完整流程(多次踩雷经验总结)

参考博客&#xff1a; linux下安装cuda和cudnn&#xff08;非root权限&#xff09;_cuda下载安装 远程服务器 linux-CSDN博客 Linux下非root用户安装CUDA_linux下cuda-toolkit-archive-CSDN博客 非root用户安装cuda10.1&#xff0c;以及CUDA不同版本间切换_非root用户.run文…

Netty 常见面试题原理解析

Netty 是一个异步的、事件驱动的网络应用程序框架&#xff0c;用于快速开发可维护的高性能协议服务器和客户端。在面试中&#xff0c;Netty 经常成为热门话题。本文将对一些常见的 Netty 面试题进行原理解析。 一、Netty 是什么&#xff1f; Netty 是一个基于 NIO&#xff08…

分立器件---运算放大器关键参数

运算放大器 关键参数 1、供电电压:有单电源电压、双电源电压,双电源电压尽量两个电源都接。如图LM358B,供电电压可以是20V或者是40V和GND。 2、输入偏置电流IB:当运放输出直流电压为零时,运放两个输入端流进或者流出直流电流的平均值。同向输入端电流IB+与反向输入端电流…

【数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 测试说明 我的通关代码: 测试结果&#xff1a; 任务描述 本关任务&#xff1a;实现二叉排序树的基本算法。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;二叉树的创建、查找和删除算法。具体如下&#xff1a; (1)由…

240004基于Jamva+ssm+maven+mysql的房屋租赁系统的设计与实现

基于ssmmavenmysql的房屋租赁系统的设计与实现 1.项目描述2.运行环境3.项目截图4.源码获取 1.项目描述 该项目在原有的基础上进行了优化&#xff0c;包括新增了注册功能&#xff0c;房屋模糊查询功能&#xff0c;管理员和用户信息管理等功能&#xff0c;以及对网站界面进行了优…

聊聊Oracle自适应查询优化

成也AQO败也AQO 因为工作的原因&#xff0c;我们接触到的客户大部分是金融和运营商行业&#xff0c;这些客户有个最大的特点是追求稳定&#xff0c;对于使用数据库新特性持保守的态度&#xff0c;不会轻易尝试某些可能会导致生产系统不稳定的新特性。上线前通常都会将一些新特…

电脑显示器选购指南2024

选择显示器是五花八门的显示参数&#xff0c;如何选择&#xff0c;以下给出参数说明&#xff0c;及部分参考&#xff1a; 1. 尺寸和分辨率 尺寸&#xff08;英寸&#xff09; 根据使用距离和用途选择合适的屏幕尺寸&#xff1a; 21-24 英寸&#xff1a;适合小桌面空间、日常…

(八)机器学习 - 线性回归

线性回归&#xff08;Linear Regression&#xff09;是一种统计学方法&#xff0c;用于建立一个或多个自变量&#xff08;解释变量&#xff09;与因变量&#xff08;响应变量&#xff09;之间的线性关系。线性回归的目的是通过最小化预测误差来找到最佳的线性拟合模型&#xff…

huggingface NLP-微调一个预训练模型

微调一个预训练模型 1 预处理数据 1.1 处理数据 1.1.1 fine-tune 使用tokenizer后的token 进行训练 batch tokenizer(sequences, paddingTrue, truncationTrue, return_tensors"pt")# This is new batch["labels"] torch.tensor([1, 1])optimizer A…

【文档搜索引擎】在内存中构造出索引结构(下)

文章目录 4.保存到磁盘中为什么要保存在磁盘中怎么保存操作步骤1. 前期准备2. 主要操作 5. 将磁盘中的数据加载到内存中Parser 类完整源码Index 类完整源码 4.保存到磁盘中 为什么要保存在磁盘中 索引本来是存储在内存中的&#xff0c;为什么要将其保存在硬盘中&#xff1f; …

STM32-FATFS文件系统

一、FATFS文件系统介绍&#xff1a; FATFS 是一个完全免费开源的 FAT/exFAT 文件系统模块&#xff0c;专门为小型的嵌入式系统而设计。它完全用标准 C 语言&#xff08;ANSI C C89&#xff09;编写&#xff0c;所以具有良好的硬件平台独立性&#xff0c;只需做简单的修改就可以…

Unity NTPComponent应用, 实现一个无后端高效获取网络时间的组件

无后端高效获取网络时间的组件 废话不多说&#xff0c;直接上源码m_NowSerivceTime 一个基于你发行游戏地区的时间偏移&#xff0c; 比如北京时区就是 8, 巴西就是-3&#xff0c;美国就是-5using Newtonsoft.Json; 如果这里报错&#xff0c; 就说明项目没有 NewtonsoftJson插件…

华为ensp中nat server 公网访问内网服务器

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月15日17点30分 &#x1f4af;趣站推荐&#x1f4af; 前些天发现了一个巨牛的&#x1f916;人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;…