PersistentStorage持久化数据无法删除
==========================

#### 问题现象

当用户登录时，会使用PersistentStorage进行部分数据的存储，当用户退出登录或切换账号时需要清除该数据，如何正确的删除数据？

#### 效果预览

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/e3/v3/SNj4Fj5AQjK7ceRJBoI-9w/zh-cn_image_0000002658794737.png?HW-CC-KV=V1&HW-CC-Date=20260709T133915Z&HW-CC-Expire=86400&HW-CC-Sign=F35198482E9304B8D242E0B29AAE6D252E1F41720A2E1CF6CE6018F6366BA1B4 "点击放大")

#### 背景知识

*   [PersistentStorage](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-persiststorage)用于实现持久化数据存储的模块。它提供了在设备本地持久化存储和读取数据的功能，适用于需要保存用户数据、应用状态、配置信息等场景。
*   [AppStorage](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-appstorage)：PersistentStorage提供状态变量持久化的能力，但是其持久化和读回UI的能力都需要依赖AppStorage。

#### 解决方案

1.  可以使用[deleteProp](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-state-management#deleteprop10)将key对应的属性从PersistentStorage中删除，需要注意的是这样删除的是持久化中的用户数据，应用中的数据依旧存在，需要用户退出应用重新进入才能看出删除的效果。如果在应用不退出的前提删除数据。
    
    PersistentStorage.persistProp('P', '123');
    
    @Entry
    @Component
    struct TestCase6 {
      build() {
        Row() {
          Column() {
            Button('删除').onClick(() \=\> {
              PersistentStorage.deleteProp('P');
              AppStorage.delete('P');
              this.getUIContext().getPromptAction().showToast({ message: '已删除持久化中的数据' });
              console.info('删除持久化数据P');
            })
            Button('查看').onClick(() \=\> {
              let appData: undefined | string \= AppStorage.get('P');
              console.info('输出：appData', appData);
            })
          }
          .width('100%')
        }
        .height('100%')
      }
    }
    
2.  如果当前有页面使用@StorageLink的属性，AppStorage.delete就无法删除。可以改成AppStorage.link的形式，删除应用数据前可以取消订阅。
    
    PersistentStorage.persistProp('id', '123456');
    
    @Entry
    @Component
    struct Test {
      linkToId: SubscribedAbstractProperty<string\> = AppStorage.link('id');
      @State uid: string | undefined \= this.linkToId.get();
    
      build() {
        Column({ space: 5 }) {
          Text(\`应用中当前id的值：${this.uid}\`)
          Button('删除本地持久化的数据')
            .onClick(() \=\> {
           _   // 删除持久化的数据后，应用中的数据还存在，需要退出应用才能看到效果_
              PersistentStorage.deleteProp('id');
              this.uid \= AppStorage.get('id');
              this.getUIContext().getPromptAction().showToast({ message: '已删除持久化中的数据' });
            })
          Button('取消linkToId')
            .onClick(() \=\> {
              this.linkToId.aboutToBeDeleted();
            })
          Button('删除应用中的状态变量')
            .onClick(() \=\> {
            _  // 如果没有订阅者，则删除成功_
              let flag \= AppStorage.delete('id');
              this.uid \= AppStorage.get('id');
              if (flag) {
                this.getUIContext().getPromptAction().showToast({ message: '删除应用状态变量成功' });
              } else {
                this.getUIContext().getPromptAction().showToast({ message: '删除应用状态变量失败' });
              }
            })
        }
        .height('100%')
        .width('100%')
      }
    }