# 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

从定义看,PersistenceV2 继承自 AppStorageV2 并扩展了手动持久化和持久化失败的回调方法,各方法说明如下:

  • connect(): 创建或获取储存的数据,参数说明如下:

    • type: 指定的类型,若未指定 key,则使用 typename 作为 key
    • keyOrDefaultCreater: 指定的key,或者是默认数据的构造器;
    • defaultCreator: 默认数据的构造器。
  • remove(): 删除指定 key 的储存数据,参数说如下:

    • keyOrType: 需要删除的 key;如果指定的是 type 类型,删除的 keytypename
  • 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

user1user2 绑定了 PersistenceV2keyUser 的对象,首次访问时创建一个 User 实例并与之绑定,user3 绑定了 PersistenceV2keyglobal_user 的对象,首次访问时创建一个 User 实例并与之绑定。

📢:user1user2 因为绑定的的 key 一致,它们是同一个实例,user3key 和它们不同则属于另外的实例,如果要求一致,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

样例运行结果如下图所示:

14_11_3_1
请作者喝杯咖啡

津公网安备 12011402001367号

津ICP备2020008934号-2

中央网信办互联网违法和不良信息举报中心

天津市互联网违法和不良信息举报中心