鸿蒙UI开发快速入门 —— part10: PersistentStorage与Environment

1、前言

我们在鸿蒙UI开发快速入门 —— part09: 应用级状态管理LocalStorage & AppStorage中已经学习了LocalStorage与AppStorage,但他们都是运行时的内存,在APP退出后所有数据将丢失。

如果我们想将一部分状态数据保存下来,让用户在下次进入app时也能恢复之前的现场,那我们就得使用PersistentStorage了。

2、PersistentStorage

2.1、基本用法与规则介绍

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

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

PersistentStorage允许的类型和值有:

  • number, string, boolean, enum 等简单类型。

  • 可以被JSON.stringify()和JSON.parse()重构的对象。例如Date, Map, Set等内置类型则不支持,以及对象的属性方法不支持持久化。

PersistentStorage不允许的类型和值有:

  • 不支持嵌套对象(对象数组,对象的属性是对象等)。因为目前框架无法检测AppStorage中嵌套对象(包括数组)值的变化,所以无法写回到PersistentStorage中。

  • 不支持undefined 和 null 。

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

  • 持久化大型数据集。

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

PersistentStorage的持久化变

<think>好的,我需要回答用户关于HarmonyOS ArkTS中PersistentStorage的用法和示例的问题。首先,我得回顾一下用户提供的引用内容,确保信息准确并正确引用。 用户提到了四个引用,都是关于PersistentStorage的,特别是AppStorage的双向同步、使用方法以及限制条件。我需要把这些信息整合起来,结构清晰地解释PersistentStorage的用途、基本用法、示例代码以及注意事项。 首先,PersistentStorage的作用是持久化存储UI状态,这点在引用[^1][^2][^3][^4]中都有提到。它和AppStorage建立双向同步,所以应用通常通过AppStorage访问PersistentStorage的数据。接下来,我需要分步骤说明如何初始化属性、同步机制、数据访问和示例代码。 在基本用法部分,应该包括如何用PersistentStorage.persistProp初始化属性,比如例子中的'userScore'和'userName'。要强调这些属性会自动同步到AppStorage,并且应用重启后数据仍然存在。然后,示例代码需要展示ArkTS的组件如何使用@StorageLink装饰器来绑定这些属性,实现UI和数据的双向同步。 注意事项方面,引用中提到数据类型限制,比如只能处理boolean、string、number等简单类型,以及对象和复杂结构需要用序列化方法处理。还有属性名不能重复,否则会覆盖,这些都需要明确列出。 最后,生成相关问题时要围绕PersistentStorage的机制、限制、其他存储方式的对比以及实际应用中的问题。比如同步机制如何工作,数据类型限制的解决方案,AppStorage的关系,以及实际开发中的常见错误。 需要确保所有数学表达式或代码格式正确,比如使用$...$或$$...$$,但在这个问题中可能更多涉及代码块。检查引用标注是否正确,每个引用标记对应正确的来源。另外,使用中文回答,保持结构清晰,分步骤说明,让用户容易理解。</think>### HarmonyOS ArkTS PersistentStorage用法解析 #### 一、PersistentStorage核心作用 PersistentStorage鸿蒙ArkTS中实现**持久化存储UI状态**的关键模块,其核心功能是AppStorage建立**双向数据同步**。应用重启后仍能保留指定属性值,例如用户登录状态$userToken$、应用配置$appConfig$等[^1]。 #### 二、基础用法四步走 1. **初始化持久化属性** 使用`PersistentStorage.persistProp()`预定义需持久化的属性: ```typescript PersistentStorage.persistProp('userScore', 95); // 数值型默认值 PersistentStorage.persistProp('userName', 'Anonymous'); // 字符串型默认值 ``` 2. **自动同步机制** 通过`@StorageLink`装饰器建立UI组件AppStorage的绑定: ```typescript @Entry @Component struct ProfilePage { @StorageLink('userScore') score: number = 0 @StorageLink('userName') name: string = '' build() { Column() { Text(`Score: ${this.score}`) // 显示持久化数值 TextInput({ text: this.name }) // 输入框双向绑定 .onChange((val) => { this.name = val }) } } } ``` 3. **数据访问路径** ```mermaid graph LR UI组件 -->|@StorageLink| AppStorage --> PersistentStorage --> 本地存储文件 ``` 4. **运行效果验证** 修改`userName`字段后杀死应用,重启时输入框会自动载入上次输入值。可通过DevEco Studio的**Database Inspector**工具直接查看SQLite数据库内容验证存储结果。 #### 三、关键限制条件 1. **数据类型限制** 支持`boolean`、`string`、`number`等基础类型,复杂对象需通过`JSON.stringify()`序列化: ```typescript const settings = { theme: 'dark', fontSize: 16 }; PersistentStorage.persistProp('appSettings', JSON.stringify(settings)); ``` 2. **命名冲突规避** 属性名全局唯一,重复调用`persistProp('aProp')`会导致值覆盖。建议采用**命名空间前缀**: ```typescript PersistentStorage.persistProp('UserProfile.avatarUrl', 'default.jpg'); ``` 3. **容量上限** 单应用默认存储上限为$2^{16}$字节(约64KB),超限需使用分布式数据管理模块[^4]。 #### 四、典型应用场景 1. 用户偏好设置(主题/语言) 2. 表单草稿自动保存 3. 游戏进度存档 4. 离线缓存关键数据 ```typescript // 完整示例:主题切换持久化 PersistentStorage.persistProp('isDarkMode', false); @Entry @Component struct SettingsPage { @StorageLink('isDarkMode') darkMode: boolean = false build() { Column() { Toggle({ type: ToggleType.Switch, isOn: this.darkMode }) .onChange((isOn) => { this.darkMode = isOn }) } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值