【已解决】HarmonyOS 鸿蒙Next卡片通过preferences存数据,主应用首次取到数据但后续不更新的问题
【已解决】HarmonyOS 鸿蒙Next卡片通过preferences存数据,主应用首次取到数据但后续不更新的问题 已解决,见4楼。
场景:在卡片的onAddForm中保存formId到preferences,供后续主应用在一些业务逻辑中,通过preferences取得所有formId,并通过formProvider.updateForm遍历更新所有卡片。
问题:卡片保存formId到preferences后,主应用仅在首次读取该preferences时,才能得到准确的数据。(后续卡片通过onAddForm向preferences新增了formId,但主应用获取的始终是首次读取时的内容)。
卡片关键代码 ets/entryformability/EntryFormAbility.ets
onAddForm(want: Want) {
// Called to return a FormBindingData object.
let formData = '';
let formId: string = want.parameters![formInfo.FormParam.IDENTITY_KEY].toString();
let pre = preferences.getPreferencesSync(this.context,{name:'TestWidgetPre'});
let preFormIdsArray:Array<string> = JSON.parse(pre.getSync('formIds','[]').toString());
if (preFormIdsArray.indexOf(formId) == -1) {
preFormIdsArray.push(formId);
}
pre.putSync('formIds',JSON.stringify(preFormIdsArray));
pre.flush();
console.log("testTag", "onAddForm", "formIds:", JSON.stringify(preFormIdsArray));
return formBindingData.createFormBindingData(formData);
}
主应用代码关键代码 ets/pages/Index.ets
getFormIds() {
let pre = preferences.getPreferencesSync(getContext(this),{name:'TestWidgetPre'});
let preFormIds = pre.getSync('formIds','[]');
this.formIdsStr = preFormIds.toString()
}
更多关于【已解决】HarmonyOS 鸿蒙Next卡片通过preferences存数据,主应用首次取到数据但后续不更新的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
最新更新,已解决。
参考了这个帖子 https://developer.huawei.com/consumer/cn/forum/topic/0204164460106541174 2楼的回复。
在主应用 preferences.getPreferencesSync
前,先用 removePreferencesFromCacheSync
清除缓存。
修改后主应用代码如下,运行验证OK。
getFormIds() {
let options: preferences.Options = { name: 'TestWidgetPre' };
preferences.removePreferencesFromCacheSync(getContext(this),options)
let pre = preferences.getPreferencesSync(getContext(this),options);
let preFormIds = pre.getSync('formIds','[]');
this.formIdsStr = preFormIds.toString();
}
更多关于【已解决】HarmonyOS 鸿蒙Next卡片通过preferences存数据,主应用首次取到数据但后续不更新的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
-
项目中是否同时存在EntryFormAbility.ets与entryAbility,不同ability中的上下文是不一致的,请参考链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/application-context-stage-V5#context%E7%9A%84%E5%85%B8%E5%9E%8B%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF
-
如果是不同ability中进行数据存储,需要将数据传递到EntryAbility(首选项数据初始化在entryAbility中的话),然后进行保存刷新,不同UIAbility中数据交互:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/uiability-intra-device-interaction-0000001820999601#ZH-CN_TOPIC_0000001820999601__%E5%90%AF%E5%8A%A8uiability%E7%9A%84%E6%8C%87%E5%AE%9A%E9%A1%B5%E9%9D%A2
感谢您的回复!
-
项目是同时存在 EntryFormAbility 与 EntryAbility,原本认为不同 ability 的上下文不一致,应该完全不互通才对。但奇怪的就是,EntryFormAbility 存入后,EntryAbility 能取到,给了一点念想,但又仅是首次才能取到。看来,该方式确实是走不通,该放弃了。
-
当前的场景正是想通过 Prerences 进行来 EntryFormAbility 向 EntryAbility 传递,但因为无法走通,接下来可能会改为采取 SQLite 的方案了。
项目中如果同时存在两个ability的话,你们进行ability跳转时会出现两个窗口吗(手机后台)或者跳转时产生闪屏问题,
EntryFormAbility是专用于卡片服务,扩展自FormExtensionAbility,独立于主应用。这两者不会存在冲突问题。
两个UIAbility的情况,我还没试过。
对这个问题很疑惑。
-
文档里有写过“首选项无法保证进程并发安全,会有文件损坏和数据丢失的风险,不支持在多进程场景下使用”,我不知道主应用中获取preference异常的问题是否跟这个有关。
-
同时,注意到preferences.getPreferences(context,options),该options有个尚未支持的dataGroupId(感觉有点像iOS的App Group),不知该配置是否为解决上述问题的正确方式。
![111.png]
卡片在EntryFormAbility中。
我认为你应该看下是否push进去了新的formId,不然应该是能正确取值的
你好,确认在卡片中是push进去了的,在卡片中取值是正常的。
而且重新Run一下程序,主应用即可正常取得数据。但卡片里再次对其进行更新,然后在主应用里再次取,就又取不到新的了。
那你可以看下三楼给出的几点参考意见,看下是否可以解决问题。
针对HarmonyOS鸿蒙Next卡片通过preferences存数据,主应用首次取到数据但后续不更新的问题,这通常是由于数据同步或更新机制未正确处理所导致。
在鸿蒙系统中,preferences一般用于存储轻量级、简单的配置数据,其更新机制可能不如数据库等存储方式实时。当卡片端更新数据到preferences后,主应用如果没有相应的监听或刷新机制,可能无法及时感知到数据的变化。
解决方法可能包括:
-
确保数据同步:卡片端更新数据后,需要确保数据被正确同步到存储中。可以检查preferences的写入操作是否成功执行。
-
主应用监听数据变化:虽然preferences本身不直接支持数据变化监听,但可以通过定期查询或设置定时器来检查数据是否有更新。
-
使用更合适的存储方式:如果数据更新频繁且需要实时同步,可以考虑使用数据库等更适合存储动态数据的方案。
-
检查代码逻辑:确保主应用在读取数据时,逻辑上没有错误,能够正确获取到最新的数据。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html,