HarmonyOS 鸿蒙Next为什么我登录信息数据持久化 preferences flush 没效果啊?
HarmonyOS 鸿蒙Next为什么我登录信息数据持久化 preferences flush 没效果啊?
static async setUser(user: userModel) {
let dataManage = await dataPreferences.getPreferences(getContext(), 'user');
dataManage.put('user', user);
dataManage.flush();
}
如果我回到主屏幕 点关闭app 再次打开 调用get这个user信息 怎么就没有了? 我看文档说put后调用flush就可以支持化,为何
没起到效果?
更多关于HarmonyOS 鸿蒙Next为什么我登录信息数据持久化 preferences flush 没效果啊?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
dataManage.put(‘user’,user) 是个异步方法. 还可能还没有真正put完成. 就执行了 dataManage.flush() 所以其实相当于并没有调用 dataManage.flush, get 也是一个异步方法, 取值是也要注意.
其实更好的实践是将操作首选项封装为一个工具类. 使用更方便. 以下是一个鸿蒙世界中一个封装的demo.
使用只需要 获取 PreferenceManager.getInstance() 然后就和和前端保存获取都非常方便了.
import { common } from '@kit.AbilityKit';
import { preferences } from '@kit.ArkData';
const PREFERENCES_NAME: string = 'DemoStore';
export class PreferenceManager {
private preferences?: preferences.Preferences;
private context = this as common.UIAbilityContext;
private static instance: PreferenceManager;
constructor() {
this.initPreference(PREFERENCES_NAME);
}
public static getInstance(): PreferenceManager {
if (!PreferenceManager.instance) {
PreferenceManager.instance = new PreferenceManager();
}
return PreferenceManager.instance;
}
async initPreference(storeName: string): Promise<void> {
return preferences.getPreferences(this.context, storeName)
.then((preferences: preferences.Preferences) => {
this.preferences = preferences;
});
}
async setValue<T>(key: string, value: T): Promise<void> {
if (this.preferences) {
this.preferences.put(key, JSON.stringify(value)).then(() => {
this.saveUserData();
})
} else {
this.initPreference(PREFERENCES_NAME).then(() => {
this.setValue<T>(key, value);
});
}
}
async getValue<T>(key: string): Promise<T | null> {
if (this.preferences) {
return this.preferences.get(key, '').then((res: preferences.ValueType) => {
let value: T | null = null;
if (res) {
value = JSON.parse(res as string) as T;
}
return value;
});
} else {
return this.initPreference(PREFERENCES_NAME).then(() => {
return this.getValue<T>(key);
});
}
}
async hasValue(key: string): Promise<boolean> {
if (this.preferences) {
return this.preferences.has(key);
} else {
return this.initPreference(PREFERENCES_NAME).then(() => {
return this.hasValue(key);
});
}
}
async deleteValue(key: string): Promise<void> {
if (this.preferences) {
this.preferences.delete(key).then(() => {
this.saveUserData();
});
} else {
this.initPreference(PREFERENCES_NAME).then(() => {
this.deleteValue(key);
});
}
}
saveUserData() {
this.preferences?.flush();
}
}
更多关于HarmonyOS 鸿蒙Next为什么我登录信息数据持久化 preferences flush 没效果啊?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
已经解决了。 把项目clear了一下。 之前相册打开一闪一闪也解决了。 感觉还不太稳定。
在HarmonyOS(鸿蒙)系统中,如果你遇到登录信息数据持久化时preferences flush
没有效果的问题,可能是由于以下几个原因:
-
同步问题:鸿蒙系统的数据持久化机制可能在不同线程间存在同步问题。确保你在正确的线程中调用
flush
方法,并且在该调用后数据已经成功写入存储。 -
存储权限:检查应用是否具有写入存储的权限。在某些情况下,权限问题可能导致数据无法正确持久化。
-
Preferences实现:鸿蒙系统的Preferences实现可能与Android有所不同。确认你使用的Preferences API是鸿蒙系统支持的版本,并且符合鸿蒙系统的API规范。
-
存储位置:检查数据是否存储在了正确的位置。鸿蒙系统可能有特定的存储路径要求,如果存储位置不正确,数据将无法正确读取或写入。
-
系统Bug:确认是否为鸿蒙系统的已知Bug。查阅鸿蒙系统的官方文档或社区论坛,看看是否有其他开发者遇到并解决了类似问题。
如果以上方法都无法解决问题,可能是系统或API层面的更深层次问题。此时,建议直接联系鸿蒙系统的官方客服以获取更专业的帮助。
如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html,