HarmonyOS鸿蒙Next中PersistentStorage和StorageLink持久化存储

HarmonyOS鸿蒙Next中PersistentStorage和StorageLink持久化存储

有一个User对象

export class User {
  constructor(name: string, age: number) {
    this.name = name
    this.age = age
  }
  name: string
  age: number
}

需要进行持久化存储,我选择了PersistentStorage和@StorageLink方式进行存储

import { User } from '../model/TranslateResult'
PersistentStorage.PersistProp<User>('user', new User('xuan',18))

@Entry
@Component
struct Tmp {
  [@StorageLink](/user/StorageLink)('user') user: User = new User('xuan', 18)
  build() {
    Text(`${this.user.name} : ${this.user.age}`)
  }
}

当我第一运行的时候,页面显示正常,Text显示的内容是 xuan : 18 但是当我重新打开应用(不是重新编译,就是简单的在设备上关掉应用然后点击桌面图标打开应用)的时候,Text显示内容是 undefined : undefined 打上断点发现重新打开应用的时候 user 是一个字符串类型,没有name和age属性,所以显示了 undefined.

我应该如何修改我的代码,让应用能正常显示呢?或者如何修改代码使得@StorageLink获取到的是一个对象而不是字符串呢?

看到文档中有写

AppStorage的属性向PersistentStorage中持久化的允许的类型是: number,string,boolean,enum基础类型。 Object中可序列化的属性。 不允许undefined和null。

但为啥@StorageLink获取到数据时返回的是字符串呢?这样的话PersistentStorage的泛型有什么意义呢?


更多关于HarmonyOS鸿蒙Next中PersistentStorage和StorageLink持久化存储的实战教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复

对于问题1: 目前`@StorageLink`注解的`get`方法返回的是 JSON 字符串,而不是对象,这是因为`persistantStorage`存储的数据是键值对的形式,而不是对象的形式。

对于问题2: 可以使用`JSON.parse()`方法将 JSON 字符串转换为 JavaScript 对象。

对于问题3: 目前`@StorageLink`注解的`get`方法返回的是 JSON 字符串,不支持直接返回对象。

更多关于HarmonyOS鸿蒙Next中PersistentStorage和StorageLink持久化存储的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


+1 我也是一样的问题

提了单子 但是开发的回答有点答非所问

半年过去了,还没解决吗

官方回复了,已知问题,后续版本修复

cke_119.png

对于问题1,persistantStorage存储的数据是键值对的形式,而不是对象的形式

为什么PersistentStorage.PersistProp<User>(‘user’, new User(‘xuan’,18))

还支持泛型呢? 是为了将泛型对象转化为字符串存储么? 只支持保存对象而不支持获取对象?

看到有同样问题的开发者

https://developer.huawei.com/consumer/cn/forum/topic/0201130851990202033?fid=0101587866109860105

看到文档中有写 https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/arkts-state-management-0000001504151156-V3#ZH-CN_TOPIC_0000001523808562__persistprop

  • AppStorage的属性向PersistentStorage中持久化的允许的类型是:

    • number,string,boolean,enum基础类型。
    • Object中可序列化的属性。
    • 不允许undefined和null。

但同样的,在指南中同样有描述 https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/arkts-persiststorage-0000001474017166-V3#section610120319595

  • PersistentStorage允许的类型和值有:
    • number, string, boolean, enum 等简单类型。
    • 可以被JSON.stringify()和JSON.parse()重构的对象。例如Date, Map, Set等内置类型则不支持,以及对象的属性方法不支持持久化。

问题如下:

  1. @StorageLink获取到数据时返回的是字符串呢?这样的话PersistentStorage的泛型有什么意义呢?
  2. 看到有开发者在论坛说他们一直是将对象转成字符串保存,用的时候再JSON.parse一下再用,有什么比较简单的方法么?
  3. 后续会不会支持StorageLink泛型直接返回对象而不是字符串呢?

在HarmonyOS鸿蒙Next中,PersistentStorageStorageLink是用于持久化存储的两种机制。PersistentStorage用于将应用数据持久化到设备存储中,支持键值对存储,适合存储小量数据。StorageLink则用于管理应用与外部存储设备(如SD卡)之间的数据链接,支持文件系统的操作,适合处理大量数据或文件。两者结合使用,可以满足不同场景下的数据持久化需求。

回到顶部