HarmonyOS鸿蒙Next中PersistenceV2 persistent_storage文件都有数据了,读取还是空的

HarmonyOS鸿蒙Next中PersistenceV2 persistent_storage文件都有数据了,读取还是空的

从Device File Browse中看数据都有的, 但是读取还是会走到默认值去

6 回复

片段代码无法完整复现问题场景,请断点调试确认以下问题:

进入应用时 PersistenceV2.connect读取数据是否先于Entryability内loadContent执行。若PersistenceV2.connect先于Entryability内loadContent执行则会读取失败,详情参考:PersistenceV2: 持久化存储UI状态 使用限制中的第10条:PersistenceV2必须与UI实例关联,持久化操作需在UI实例初始化完成后调用(即loadContent回调触发后)。

若存在上述问题,请确认是否存在以下情况:

比如:

1.检查Entryability内逻辑是否存在PersistenceV2.connect先于loadContent执行的情况。

  1. 确认Entryability内是否存在引用PersistenceV2.connect所在的包的某个实例,由于一些关联因素导致PersistenceV2.connect所在的类优先于loadContent创建了。

比如:

commonlib内同时存在xxx与AccountUtil(AccountUtil中初始化PersistenceV2.connect方法)实例,且同时在commonlib包的commonlib/src/Index.ets文件中集体导出,该方式可以直接通过:

import { xxx } from 'commonlib';

直接导出xxx实例,但是该实例执行了commonlib/src/Index.ets文件,导致AccountUtil实例也被一起伴随着xxx的引用提前创建了。

则AccountUtil会执行在loadContent前。也就是PersistenceV2.connect会执行在loadContent前。导致本地数据读取失败。

方案一:

Entryability内取消,

import { xxx } from 'commonlib'

的导出方式。

import { xxx } from 'commonlib/src/main/ets/util/xxx';

或:

方案二:

保留在Entryability内

import { xxx } from 'commonlib'

的导出方式

取消在与xxx相同包中的commonlib/src/Index.ets文件中导出PersistenceV2.connect所在的AccountUtil类。或者将AccountUtil写在与xxx不同的包中,避免被优先创建。

更多关于HarmonyOS鸿蒙Next中PersistenceV2 persistent_storage文件都有数据了,读取还是空的的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


您好,这边测试没有复现,使用PersistenceV2可以实现持久化数据能力,不会返回默认的值。

麻烦您可以发下可以复现问题的demo以及DevEco Studio版本、设备版本号嘛,用于定位问题

import { PersistenceV2, Type } from '@kit.ArkUI';

@ObservedV2
class SampleClass {
  p1?: number = 0;
  p2?: number = 0;
}

@ObservedV2
class FatherSampleClass {
  @Type(SampleClass)
  @Trace f: SampleClass = new SampleClass();
}

@Entry
@ComponentV2
export struct TestPersistenceV2 {
  @Local v: FatherSampleClass = PersistenceV2.connect(FatherSampleClass, () => new FatherSampleClass())!;

  build() {
    Column() {
      Text(`ADD`)
        .fontSize(32)
        .onClick(() => {
          let sample = new SampleClass();
          sample.p1 = Date.now();
          sample.p2 = (this.v.f.p2 ?? 0) + 1;
          this.v.f = sample;
        })
      Text(`${JSON.stringify(this.v.f)}`)
        .fontSize(32)
    }
    .width("100%")
    .alignItems(HorizontalAlign.Center)
  }
}

【背景知识】 PersistenceV2是应用程序中的可选单例对象,此对象的作用是持久化存储UI相关的数据,以确保这些属性在应用程序重新启动时的值与应用程序关闭时的值相同。

还没解决,

您好,已在2楼回复,

在HarmonyOS Next中,PersistenceV2的persistent_storage文件有数据但读取为空,通常是由于文件路径或访问权限问题导致。请检查应用沙箱路径是否正确,并确认文件操作权限已配置。确保使用正确的API进行读写,避免异步操作未完成时读取。

在HarmonyOS Next的PersistenceV2中,出现文件有数据但读取为空的情况,通常是由于数据访问的上下文或路径不一致导致的。请按以下步骤排查:

  1. 确认应用沙箱路径:PersistenceV2的数据存储在应用沙箱内。通过Device File Browse查看时,需确保当前查看的正是该应用对应的沙箱目录,而非其他路径或通用存储区域。

  2. 检查读写实例的一致性:确保写入和读取使用的是同一个persistentStorage实例(即相同的StorageAreaStorageScope配置)。例如,如果数据是以StorageScope.APP范围写入的,读取时也必须使用相同的Scope。

  3. 验证Key值:确认读取时使用的Key与写入时的Key完全一致(包括大小写)。

  4. 排查异步时序:如果读写操作涉及异步调用(如Promise),请确保在读取前,写入操作已经完成。可尝试在写入后添加适当的同步或等待逻辑。

  5. 检查数据格式:尝试读取一个简单的数据类型(如字符串)进行测试,以排除复杂对象序列化/反序列化可能引起的问题。

若上述步骤均无误,可尝试重新创建persistentStorage实例或重启应用,以排除临时状态异常。

回到顶部