文档管理中心
我的
|

HarmonyOS 5

为什么使用preferences的flush持久化成功的数据在重启应用后还是被清除了

以下是代码
收起
自动换行
深色代码主题
复制
import { preferences } from '@kit.ArkData';
import common from '@ohos.app.ability.common';

class Store {
  private dataPreferences: preferences.Preferences | null = null;
  private context: common.UIAbilityContext | null = null;

  /** 初始化 */
  init(context: common.UIAbilityContext) {
    this.context = context
    preferences.getPreferences(context, 'myStore', (err: BusinessError, obj: preferences.Preferences) => {
      if (err === undefined) {
        console.log('初始化成功')
        this.dataPreferences = obj
      } else {
        this.dataPreferences = null
        console.log('失败原因:', err.message)
      }
    });
  }

  /** 设置token */
  setToken(token: string) {
    console.log('设置token', token);
    this.dataPreferences?.put('token', token, (err: BusinessError) => {
      if (err === undefined) {
        console.log('写入成功')
        this.flushToken()
      } else {
        this.setToken(token)
      }
    })

  }

  /** 持久化token */
  flushToken() {
    this.dataPreferences?.flush((flushErr: BusinessError) => {
      if (flushErr === undefined) {
        console.log('持久化成功')
      } else {
        console.log('持久化失败:', flushErr.message)
        this.flushToken()
      }
    })
  }

  /** 获取token */
  getToken(): string {
    try {
      return this.dataPreferences?.getSync('token', '') as string
    } catch (err) {
      return ''
    }

  }

  /** 清除token */
  removeToken() {
    this.dataPreferences?.delete('token', (err: BusinessError) => {
      if (err === undefined) {
        console.log('删除成功')
        this.flushToken()
      } else {
        this.removeToken()
      }
    })
  }
}

export default new Store()
在EntryAbility中初始化,在其它页面使用set和get方法均成功,但是重启应用后数据就没有了,使用的是模拟器(Mate 80 Pro Max)
点赞
收藏
回复
7
分享
举报
浏览183 发布于2025-12-31 09:28浙江
全部评论
最多点赞
最新发布
最早发布
|
技术支持

开发者您好,分析问题为使用getPreferences()异步方法引起,可采用如下方式解决:

【解决方案】

getPreferences()方法为异步方法,在后续使用首选项Preferences实例时需先确保初始化完成,改用getPreferencesSync()同步方法初始化首选项实例或在初始化方法前加上await等待首选项初始化完成后,再使用插入、查询、删除等方法。

【背景知识】
用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。数据存储形式为键值对,键的类型为字符串型,值的存储数据类型包括数字型、字符型、布尔型以及这3种类型的数组类型。详情请参考用户首选项使用指南及相关API。

4楼编辑于2026-02-04 08:28 来自广东

1、检查运行配置,是否勾选 Keep Application Data

cke_420.png

2、直接通过Device File Browser查看沙箱里 preferences 文件, 位置在: /data/storage/el2/base/haps/entry/preferences/preferences

1
3楼回复于2025-12-31 10:02 来自四川
  • 一幻一世界
    感谢找到原因了
    2026-01-04 02:46 来自浙江
重启后,在get数据的时候,打印下this.dataPreferences是否存在,有可能这个时候还没初始化成功;
1
2楼回复于2025-12-31 10:02 来自浙江
  • 一幻一世界
    感谢找到原因了
    2026-01-04 02:46 来自浙江
最近我也遇到这种问题
1
1楼回复于2025-12-31 09:45 来自广东
  • 一幻一世界
    我是还没有初始化完成,你可以看一下你的是不是也这样
    2026-01-04 02:47 来自浙江
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要提问题

了解社区公约,与您携手共创和谐专业的开发者社区。