# 14.11:PersistenceV2
AppStageV2 是 ArkUI 开发框架提供的内存级全局 UI 状态存储中心,它不支持数据本地持久化,为了实现数据持久化的能力,ArkUI 开发框架提供了 @PersistenceV2 装饰器,本节笔者简单介绍一下该装饰器的使用。
# 14.11.1:约束与限制
- PersistenceV2 关联的 key 必须保证同类型,否则应用异常。
- PersistenceV2 关联的 key 长度不超过
255
,禁止非法字符。 - PersistenceV2 持久化的数据必须是 class 对象。
- PersistenceV2 只能在 UI 线程内使用,不支持 @Sendable。
- PersistenceV2 属于应用级数据仓库,支持跨组件、跨页面跨
Ability
数据共享。 - PersistenceV2 不支持循环引用的对象。
- PersistenceV2 单个
key
支持数据大小约 8k,过大会导致持久化失败。 - PersistenceV2 只能自动持久化 @Trace 装饰的数据,其它数据需要自己手动持久化。
# 14.11.2:语法介绍
PersistenceV2
提供了应用级的全局数据共享和持久化的能力,它的定义如下:
export declare class AppStorageV2 {
static connect<T extends object>(type: TypeConstructorWithArgs<T>, keyOrDefaultCreator?: string | StorageDefaultCreator<T>, defaultCreator?: StorageDefaultCreator<T>): T | undefined;
static remove<T>(keyOrType: string | TypeConstructorWithArgs<T>): void;
static keys(): Array<string>;
}
export declare class PersistenceV2 extends AppStorageV2 {
static save<T>(keyOrType: string | TypeConstructorWithArgs<T>): void;
static notifyOnError(callback: PersistenceErrorCallback | undefined): void;
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
从定义看,PersistenceV2
继承自 AppStorageV2
并扩展了手动持久化和持久化失败的回调方法,各方法说明如下:
connect(): 创建或获取储存的数据,参数说明如下:
- type: 指定的类型,若未指定
key
,则使用type
的name
作为key
; - keyOrDefaultCreater: 指定的key,或者是默认数据的构造器;
- defaultCreator: 默认数据的构造器。
- type: 指定的类型,若未指定
remove(): 删除指定
key
的储存数据,参数说如下:- keyOrType: 需要删除的
key
;如果指定的是type
类型,删除的key
为type
的name
。
- keyOrType: 需要删除的
keys(): 返回所有 AppStorageV2 中的
key
。save(): 手动进行数据持久化
notifyOnError(): 序列化或者反序列化失败时,执行该回调;若传入
undefined
,取消该回调
connect() 方法的使用格式如下:
@Entry
@ComponentV2
struct Index {
// key为User
private user1: User = PersistenceV2.connect(User, () => new User())!
// key为User
private user2: User = PersistenceV2.connect(User, "", () => new User())!
// key为global_user
private user3: User = PersistenceV2.connect(User, "global_user", () => new User())!
build() { }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
user1
和 user2
绑定了 PersistenceV2 内 key
为 User
的对象,首次访问时创建一个 User
实例并与之绑定,user3
绑定了 PersistenceV2 内 key
为 global_user
的对象,首次访问时创建一个 User
实例并与之绑定。
📢:user1
和 user2
因为绑定的的 key
一致,它们是同一个实例,user3
的 key
和它们不同则属于另外的实例,如果要求一致,key
必须保证一致。
# 14.10.3:简单样例
AppStorageV2 的简单实用如下所示:
import { AppStorageV2 } from '@kit.ArkUI';
@ObservedV2
class User {
@Trace
userName: string = "张三"
@Trace
birthday: string = "2020-4-12"
}
@Entry @ComponentV2 struct Page_state {
// key为User
private user: User = AppStorageV2.connect(User, () => new User())!;
build() {
Column({space: 20}) {
Text("用户:" + this.user.userName + ", 生日:" + this.user.birthday)
Button("更改姓名")
.onClick(() => {
this.user.userName = "李四:" + new Date().getMilliseconds().toString()
})
CustomWidget()
}
.width("100%")
}
}
@ComponentV2 struct CustomWidget {
// key为User
@Local updateBirthday: User = AppStorageV2.connect(User, () => new User())!;
build() {
Column({space: 20}) {
Text("用户:" + this.updateBirthday.userName + ", 生日:" + this.updateBirthday.birthday)
Button("更改生日")
.onClick(() => {
this.updateBirthday.birthday = new Date().getMilliseconds().toString()
})
}
.width("100%")
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
样例运行结果如下图所示:


请作者喝杯咖啡
©arkui.club版权所有,禁止私自转发、克隆网站。