🎉 博客主页:【剑九_六千里-优快云博客】【剑九_六千里-掘金社区】
🎨 上一篇文章:【HarmonyOS第六章:组件状态共享(父子组件传参、多层级组件传参、@Watch监听状态变化、@Observed与@ObjectLink、多层嵌套数据更新)】
🎠 系列专栏:【HarmonyOS系列】
💖 感谢大家点赞👍收藏⭐评论✍
1. PersistentStorage
PersistentStorage
允许将选定的 AppStorage
属性保留在设备磁盘上,以便在应用程序关闭后仍然保持持久化。以下是关于PersistentStorage
的一些细节和注意事项:
UI
和业务逻辑不应直接访问PersistentStorage
中的属性,所有属性访问都应通过AppStorage
进行。任何在AppStorage
中的更改都会自动同步到PersistentStorage
。PersistentStorage
支持存储简单类型数据,如数字(number
)、字符串(string
)、布尔(boolean
)、枚举(enum
)等。- 如果需要存储对象类型的数据,可以将其转换为
JSON
字符串后再存储。 - 注意,持久化变量最好是小于
2KB
的数据。如果开发者需要存储大量的数据,建议使用数据库API来进行管理和存储。
1.1. 简单数据类型的持久化,获取和修改
1.1.1. 语法
// 1. 通过 PersistentStorage.persistProp() 定义要存储的数据
// 参数一:存储的属性;参数二:存储的值
PersistentStorage.persistProp("xxx", xxx)
// 2. 通过 @StorageProp() 或 @StorageLink() 接收数据
@StorageProp("xxx")
@StorageLink("xxx")
// 3. 接收数据
xxx: number = 0;
// 4. 通过 this.xxx 使用数据
this.xxx
1.1.2. 使用示例
使用 PersistentStorage
存储数据,使用 @StorageLink
或 @StorageLink
接收数据,同时数据支持修改:
// PersistentStorage 写入磁盘-app关闭数据依然存在,持久化存储
// 存储简单数据类型:number string boolean等等
// 存储负载数据类型:array object function
PersistentStorage.PersistProp("num",100)
@Entry
@Component
struct Index {
@StorageLink("num") // 获取数据,单向数据流,只是组件内可以改变数据,并不会写入 PersistentStorage
// @StorageLink("num") // 获取数据,双向数据流,本地修改会同步写入到 PersistentStorage
num:number=0 // 如果未存储,默认初始值
build() {
Column({
space:10}) {
Text(`${
this.num}`)
Button("修改age").onClick(()=>{
this.num++
})
}.width('100%')
.height('100%')
}
}
1.2. 复杂数据类型的持久化,获取和修改
1.2.1. 基本使用
- 注意:存储复杂类型数据时,value 必须是json
// 注意:存储复杂类型数据时,value 必须是json
PersistentStorage.persistProp("user", JSON.stringify({
name: "张三", age: 18}))
interface User {
name: string;
age: number;
}
@Entry
@Component
struct Index {
@StorageLink("user") // 获取数据 @StorageLink("user") 或 @StorageProp("user")
userInfo: string = "{}" // 默认值
@State user: User = JSON.parse(this.userInfo); // 将接收到的json转成object
build() {
Column() {
Text(`${
this.user.name}--${
this.user.age}`) // 使用传入的数据
Button("修改Age")
.onClick(() => {
this.user.age++;
})
}
.width("100%")
.height("100%")
}
}
1.2.2. 使用 AppStorage.get() 获取数据,AppStorage.set()写入数据
这个例子中使用 @StorageLink("user")
获取数据,可以实现需求,同时我们也可以使用 AppStorage.get()
来获取数据:
// 注意:存储复杂类型数据时,value 必须是json
PersistentStorage.persistProp("user", JSON.stringify({
name: "张三", age: 18}))
interface User {
name: string;
age: number;
}
@Entry
@Component
struct Index {
@StorageLink("user")
userInfo: string = "{}"
@State user: User = JSON.parse(this.userInfo); // 将接收到的json转成object
build() {
Column() {
Text(`${
this.user.name}--${
this.user.age}`) // 使用传入的数据
Button("修改Age").onClick(() => {
this.user.age++;
})
Button("获取user").onClick(() => {
const res = AppStorage.get<string>("user") // 获取到的是原数据
console.log(res)
})
}
.width("100%")
.height("100%")
}
}
此时点击修改Age按钮,可以发现age被改变了,但 AppStorage.get()
获取到的是改变前的数据,此时可以通过 AppStorage.set()
重新设置数据 :
// 注意:存储复杂类型数据时,value 必须是json
PersistentStorage.persistProp("user", JSON.stringify({
name: "张三", age: 18}))
interface User {
name: string;
age: number;
}