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
存取数据的过程:
操作步骤如下:
- 应用先使用
remove
接口删除当前的preference
对象缓存; - 再通过
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
更多关于HarmonyOS鸿蒙Next中服务卡片通过preferences缓存的数据与应用获取到的数据不一致的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,服务卡片通过preferences
缓存的数据与应用获取到的数据不一致,可能是由于以下原因:
-
数据同步机制:服务卡片和主应用可能使用了不同的
preferences
实例或存储路径,导致数据未同步。preferences
在鸿蒙中默认是进程内共享的,但服务卡片和主应用可能运行在不同的进程或沙盒环境中,导致数据隔离。 -
生命周期差异:服务卡片的生命周期与主应用不同,可能在数据更新时未及时同步。例如,服务卡片可能未在数据变化时触发
onUpdateForm
方法,导致缓存数据未刷新。 -
缓存策略:服务卡片可能使用了独立的缓存策略,未与主应用保持一致。例如,服务卡片可能设置了较长的缓存过期时间,导致数据未及时更新。
-
数据存储方式:
preferences
存储的数据可能是键值对形式,如果服务卡片和主应用使用了不同的键或命名空间,会导致数据不一致。 -
异步更新问题:如果数据更新是异步进行的,服务卡片可能在数据未完全写入
preferences
时就读取了旧数据。 -
权限问题:服务卡片可能没有足够的权限访问主应用的
preferences
数据,导致读取失败或获取到默认值。 -
版本兼容性:鸿蒙系统的不同版本可能对
preferences
的实现有差异,导致数据读取不一致。 -
多实例问题:如果服务卡片有多个实例,每个实例可能独立缓存数据,未与主应用同步。
解决此类问题,需确保服务卡片和主应用使用相同的preferences
实例,并在数据更新时及时同步。