HarmonyOS 鸿蒙Next为什么我登录信息数据持久化 preferences flush 没效果啊?

发布于 1周前 作者 itying888 来自 鸿蒙OS

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

3 回复

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没有效果的问题,可能是由于以下几个原因:

  1. 同步问题:鸿蒙系统的数据持久化机制可能在不同线程间存在同步问题。确保你在正确的线程中调用flush方法,并且在该调用后数据已经成功写入存储。

  2. 存储权限:检查应用是否具有写入存储的权限。在某些情况下,权限问题可能导致数据无法正确持久化。

  3. Preferences实现:鸿蒙系统的Preferences实现可能与Android有所不同。确认你使用的Preferences API是鸿蒙系统支持的版本,并且符合鸿蒙系统的API规范。

  4. 存储位置:检查数据是否存储在了正确的位置。鸿蒙系统可能有特定的存储路径要求,如果存储位置不正确,数据将无法正确读取或写入。

  5. 系统Bug:确认是否为鸿蒙系统的已知Bug。查阅鸿蒙系统的官方文档或社区论坛,看看是否有其他开发者遇到并解决了类似问题。

如果以上方法都无法解决问题,可能是系统或API层面的更深层次问题。此时,建议直接联系鸿蒙系统的官方客服以获取更专业的帮助。

如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部