鸿蒙编辑器—arkts状态持久化-PersistentStorage

一、核心概念与应用价值​

       在 ArkTS 开发体系中,PersistentStorage作为状态持久化的核心组件,肩负着数据长期存储与管理的重要使命。其核心功能在于确保应用数据在设备重启、应用关闭等场景下不丢失,极大提升了应用的可用性与用户体验。无论是记录用户个性化配置,还是保存应用运行状态数据,PersistentStorage都为应用提供了稳定的数据存储基石。​

二、存储模型与数据类型支持​

PersistentStorage采用经典的键值对(Key-Value)存储模型,以直观、高效的方式实现数据的读写。开发者通过定义唯一的键(Key)标识数据,以值(Value)存储具体信息。在数据类型支持上,它不仅涵盖字符串、数字、布尔值等基本类型,还可处理对象、数组等复杂数据结构。例如,在新闻类应用中,可将用户浏览历史以 JSON 格式序列化后存储,读取时反序列化还原数据结构,便于后续分析与展示。​

三、核心操作接口详解​

3.1 数据写入(setItem)​

       setItem方法用于将数据写入存储,接收键和值作为参数,返回 Promise 对象用于处理操作结果。通过then方法可执行写入成功后的逻辑,catch方法捕获写入过程中的错误。如将用户设置的主题模式存储时,可调用PersistentStorage.setItem('theme_mode', 'dark'),并在then回调中提示用户设置成功。​

实例:LocalStorage和AppStorage都是运行时的内存,在应用退出后就没有了,如果要在应用退出后再次启动依然能保存选定的结果,这就需要用到PersistentStorage。

PersistentStorage.persistProp<string>('info','宇智波带土·白面具')

@Entry
@Component
struct PersistentStoragePage01 {
  @StorageLink('info')
  info:string=''

  build() {
    Row() {
      Column() {
        Text(this.info)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(()=>{
            this.info+='!'
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

 核心步骤:

  1. 初始化PersistentStorage
  2. 通过 AppStorage 获取并修改数据
  3. 重启应用,检测结果

3.2 数据读取(getItem)​

getItem方法用于从存储中获取数据,传入键后返回 Promise 对象。在then回调中可获取对应值,若键不存在则返回null。例如,在启动应用时,通过PersistentStorage.getItem('theme_mode')获取用户主题设置,据此渲染应用界面。​

注意

  • 可以存储被JSON.stringify()和JSON.parse()重构的对象。Date, Map, Set等内置类型则不支持,以及对象的属性方法不支持持久化。
  • 如果是嵌套对象(对象数组,对象的属性是对象等)。修改单个属性无法写回到PersistentStorage中, 需要替换整个对象。
  • 不支持 undefined 和 null
  • interface fruits {
      name: string
      price: number
    }
    
    // 初始化仓库
    PersistentStorage.persistProp<fruits[]>('fruits', [
      { name: '西瓜', price: 22 },
      { name: '桃子', price: 11 },
      { name: '菠萝', price: 15 }
    ])
    
    
    @Entry
    @Component
    struct Index {
      @StorageLink('foods')
      fruits: fruits[] = []
    
      build() {
        Column({ space: 20 }) {
          ForEach(this.fruits, (item: fruits) => {
            Text('name: ' + item.name)
              .fontSize(30)
              .onClick(() => {
                // AppStorage.set('foods', [{ name: '西瓜-加冰', price: 12 }])
                this.fruits[0] = { name: '西瓜-加冰-沙瓤', price: 12 }
              })
          })
    
        }
        .width('100%')
        .height('100%')
      }
    }

3.3 数据删除与清空​

removeItem方法用于删除指定键的数据,满足数据清理需求;clear方法则可清空所有存储数据,适用于应用重置等场景。例如,当用户注销账户时,可调用PersistentStorage.clear()删除所有个人相关数据。​

(此处不做演示)

四、安全机制设计​

4.1 沙盒隔离​

PersistentStorage采用沙盒机制,将每个应用的数据独立存储,避免不同应用间的数据非法访问与泄露,从底层保障数据安全。​

4.2 数据加密​

对于密码、支付信息等敏感数据,开发者可结合 AES、RSA 等加密算法,在存储前对数据加密,读取时解密,进一步增强数据安全性。​

五、性能优化策略​

5.1 缓存机制​

PersistentStorage内置缓存机制,对频繁读取的数据进行缓存,减少磁盘操作,提升数据读取效率。当应用多次请求相同数据时,可直接从缓存获取,显著缩短响应时间。​

5.2 数据管理优化​

    开发者需合理控制存储数据量,避免因存储过多数据导致性能下降。定期清理不再使用的数据,采用分页存储等策略,也是优化性能的有效手段。

​       总之,我们常用的两种储存方式形成互补关系 ——APPStorage解决应用内部高效状态流转问题,PersistentStorage解决数据持久化存储问题。本文主要阐述PersistentStorage,其他数据储存方式请关注后续文章

ArkTS 中实现数值数据的持久化存储,通常使用 `PersistentStorage` 模块结合 `@StorageLink` 装饰器来完成。该方法可以将数值保存在设备磁盘中,即使应用关闭或设备重启,数据依然存在。 ### 实现步骤 1. **初始化 PersistentStorage** 在应用启动时,需要调用 `PersistentStorage` 的初始化方法,确保可以进行数据持久化操作。这一步通常在 `@Entry` 组件中执行。 2. **使用 @StorageLink 绑定数值属性** 通过 `@StorageLink("key")` 装饰器,将组件中的属性与存储中的键绑定。当属性值发生变化时,会自动更新持久化存储中的数据。 ### 示例代码 ```typescript // 初始化 PersistentStorage PersistentStorage.persistProp("score", 0); // 初始值为0 @Component struct GameScore { // 使用 @StorageLink 绑定 score 属性 @StorageLink("score") score: number = 0; build() { Column() { Text(`当前分数:${this.score}`) .fontSize(20) .onClick(() => { // 更新分数 this.score += 10; }) } .width('100%') .height('100%') } } ``` 在上述示例中,点击文本会增加 `score` 的值,这个值会通过 `@StorageLink` 自动保存到 `PersistentStorage` 中,即使应用重启也不会丢失。 ### 注意事项 - `PersistentStorage` 适用于存储轻量级的状态数据,如用户偏好、配置信息等。对于大量数据或复杂结构,建议使用文件系统或数据库方案。 - 在使用 `@StorageLink` 时,必须确保对应的键已经在 `PersistentStorage` 中注册,否则可能会导致运行时错误。 ### 数据更新机制 当绑定的属性发生变化时,`@StorageLink` 会自动将新值写入 `PersistentStorage`,确保数据的持久性。这种机制使得组件状态持久化数据保持同步,无需手动调用写入方法[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值