HarmonyOS鸿蒙Next中服务卡片通过preferences缓存的数据与应用获取到的数据不一致

HarmonyOS鸿蒙Next中服务卡片通过preferences缓存的数据与应用获取到的数据不一致

【问题现象】

服务卡片在onAddForm()生命周期拿到formID,通过preferences缓存到本地,通过DevEco Studio中Device File Browser查看数据确定数据持久化成功。但应用UIAbility通过preferences获取到的数据与服务卡片的不同。重启APP后,两者的数据才一致。

错误代码:

let options: preferences.Options = { name: 'formStore' };
let formPreferences: preferences.Preferences | undefined | null;

async function getFormId(context: Context): Promise<string> {
  if (!formPreferences) {
    formPreferences = await preferences.getPreferences(context, options);
  }
  let formId = formPreferences?.getSync(CommonConstants.FORM_INFO_2_2_ID, "") as string
  return Promise.resolve(formId)
}

export async function setFormId(context: Context, formId: string) {
  if (!formPreferences) {
    formPreferences = await preferences.getPreferences(context, options);
  }
  formPreferences.put(CommonConstants.FORM_INFO_2_2_ID, formId)
  formPreferences.flush()
}

【定位思路】

服务卡片通过preferences进程实例缓存数据后持久化到本地,与应用通过preferences实例获取到的数据不一致,但在重启应用后数据一致了。因此考虑应用拿到的是缓存的数据,和持久化到本地的数据不一致。

【解决方案】

应用每次获取preference实例前需要从本地文件中重新初始化,就能保证和卡片设置的preference数据一致。如下描述了程序通过preferences存取数据的过程:

点击放大

操作步骤如下:

  1. 应用先使用remove接口删除当前的preference对象缓存;
  2. 再通过loadPreference重新初始化preference对象及其缓存;

示例代码如下:

import { PreferenceUtil } from './PreferenceUtil';
import { preferences } from '@kit.ArkData';
import { BusinessError } from '@kit.BasicServicesKit';

@Entry
@Component
struct Index {
  onPageShow(){
    console.log('进入Index中onPageShow')
    preferences.removePreferencesFromCache(getContext(this), 'moreStore', (err: BusinessError) => {
      // 重新初始化
      PreferenceUtil.getInstance().loadPreference(getContext(this),'moreStore')
      if (err) {
        console.error("Failed to remove preferences. code =" + err.code + ", message =" + err.message);
        return;
      }
      console.info("Succeeded in removing preferences.");
    })
  }

  @State message: string = 'Hello World';
  build() {
    Column(){
      Button('获取')
        .onClick(()=>{
          let val = PreferenceUtil.getInstance().getPreferenceValue('name','默认写法')
          console.info("名字是: " + val);
        })
    }
  }
}

更多关于HarmonyOS鸿蒙Next中服务卡片通过preferences缓存的数据与应用获取到的数据不一致的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next中服务卡片通过preferences缓存的数据与应用获取到的数据不一致的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,服务卡片通过preferences缓存的数据与应用获取到的数据不一致,可能是由于以下原因:

  1. 数据同步机制:服务卡片和主应用可能使用了不同的preferences实例或存储路径,导致数据未同步。preferences在鸿蒙中默认是进程内共享的,但服务卡片和主应用可能运行在不同的进程或沙盒环境中,导致数据隔离。

  2. 生命周期差异:服务卡片的生命周期与主应用不同,可能在数据更新时未及时同步。例如,服务卡片可能未在数据变化时触发onUpdateForm方法,导致缓存数据未刷新。

  3. 缓存策略:服务卡片可能使用了独立的缓存策略,未与主应用保持一致。例如,服务卡片可能设置了较长的缓存过期时间,导致数据未及时更新。

  4. 数据存储方式preferences存储的数据可能是键值对形式,如果服务卡片和主应用使用了不同的键或命名空间,会导致数据不一致。

  5. 异步更新问题:如果数据更新是异步进行的,服务卡片可能在数据未完全写入preferences时就读取了旧数据。

  6. 权限问题:服务卡片可能没有足够的权限访问主应用的preferences数据,导致读取失败或获取到默认值。

  7. 版本兼容性:鸿蒙系统的不同版本可能对preferences的实现有差异,导致数据读取不一致。

  8. 多实例问题:如果服务卡片有多个实例,每个实例可能独立缓存数据,未与主应用同步。

解决此类问题,需确保服务卡片和主应用使用相同的preferences实例,并在数据更新时及时同步。

回到顶部