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
对于问题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 我也是一样的问题
提了单子 但是开发的回答有点答非所问
半年过去了,还没解决吗
官方回复了,已知问题,后续版本修复
对于问题1,persistantStorage存储的数据是键值对的形式,而不是对象的形式
为什么PersistentStorage.PersistProp<User>(‘user’, new User(‘xuan’,18))
还支持泛型呢? 是为了将泛型对象转化为字符串存储么? 只支持保存对象而不支持获取对象?
看到有同样问题的开发者
https://developer.huawei.com/consumer/cn/forum/topic/0201130851990202033?fid=0101587866109860105
-
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等内置类型则不支持,以及对象的属性方法不支持持久化。
问题如下:
- @StorageLink获取到数据时返回的是字符串呢?这样的话PersistentStorage的泛型有什么意义呢?
- 看到有开发者在论坛说他们一直是将对象转成字符串保存,用的时候再JSON.parse一下再用,有什么比较简单的方法么?
- 后续会不会支持StorageLink泛型直接返回对象而不是字符串呢?
在HarmonyOS鸿蒙Next中,PersistentStorage
和StorageLink
是用于持久化存储的两种机制。PersistentStorage
用于将应用数据持久化到设备存储中,支持键值对存储,适合存储小量数据。StorageLink
则用于管理应用与外部存储设备(如SD卡)之间的数据链接,支持文件系统的操作,适合处理大量数据或文件。两者结合使用,可以满足不同场景下的数据持久化需求。