HarmonyOS 首选项无法读取Map类型的数据

在首选项中获取应用设置信息,调用数据类型Map报错,后来换成二维数组保存和获取数据均无问题。数据类型定义如下:

export class UserBean {
  // 用户登录成功后要保存的token
  public token: string = ""
  public persistence_username = ""
  public fontSize: number = 1
  public menuItemSwich:boolean[] = []
  public turnOnMenuID: Map<string,boolean> = new Map()
  public turnOnMenuID_1: Array<Array<string|boolean>> = []
}

调用代码如下:

console.log("turnOnMenuID:" + MyPreferencesUtil.getInstance().mUserInfo.turnOnMenuID.has("1"))
console.log("turnOnMenuID_1:" + MyPreferencesUtil.getInstance().mUserInfo.turnOnMenuID_1)
HarmonyOS
2天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zxjiu

hasSync(key: string): boolean检查key值是否是字符出。

import dataPreferences from '@ohos.data.preferences';

@Entry
@Component
struct Page5 {
  @State message: string = 'Hello World';

  build() {
    Column() {
      Button('test')
        .onClick(() => {
          this.getMapValue()
        })
    }
  }

  getMapValue() {
    let options: dataPreferences.Options = { name: 'myStore' };
    let preferences = dataPreferences.getPreferencesSync(getContext(this), options);
    let map: Map<string, boolean> = new Map()
    map.set("1", true)
    map.set("2", false)
    console.log("map1的值:" + map.get('1'))
    //插入map的值到首选项
    preferences.putSync('1', map.get('1'));
    //插入map的值到首选项
    let pre_map_value = preferences.getSync('1', 'default');
    console.log('首选项中key为1的值:' + pre_map_value)
    if (preferences.hasSync('1')) {
      console.info("The key 'startup' is contained.");
    }
  }
}

不同的模块页面参考共享用户首选项:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-data-sendablepreferences-V5

参考示例:

import { Context } from '@kit.AbilityKit';
import { sendablePreferences } from '@kit.ArkData';
import { lang } from '@kit.ArkTS';

export class PreferenceUtil {
  private pref: sendablePreferences.Preferences | undefined = undefined
  private static instance: PreferenceUtil;

  public static getInstance(): PreferenceUtil {
    if (PreferenceUtil.instance == null) {
      PreferenceUtil.instance = new PreferenceUtil();
      console.debug('PreferenceUtil getInstance  new  ')
    }
    return PreferenceUtil.instance;
  }

  async loadPreference(context: Context, storeName: string) {
    try { // 加载preferences
      this.pref = await sendablePreferences.getPreferences(context, { name: storeName })
      console.debug(`加载Preferences成功`)
    } catch (e) {
      console.info(`加载Preferences失败`, JSON.stringify(e))
    }
  }

  async putPreferenceValue(key: string, value: lang.ISendable) {
    if (!this.pref) {
      console.debug(`Preferences 尚未初始化!`)
      return
    }
    try {
      // 写入数据
      await this.pref.put(key, value)
      // 刷盘
      await this.pref.flush()
      console.debug(`保存Preferences[${key} = ${value}]成功`)
    } catch (e) {
      console.debug(`保存Preferences[${key} = ${value}]失败`, JSON.stringify(e))
    }
  }

  async getPreferenceValue(key: string, defaultValue: lang.ISendable) {
    if (!this.pref) {
      console.debug(`Preferences 尚未初始化!`)
      return
    }
    try {
      // 读数据
      let value = await this.pref.get(key, defaultValue)
      console.debug(`读取Preferences[${key} = ${value}]成功`)
      return value
    } catch (e) {
      console.debug(`读取Preferences[${key}]失败`, JSON.stringify(e))
      return
    }
  }
}

app启动的时候初始化一次PreferenceUtil.getInstance().loadPreference(this.context,‘moreStore’)

其他任意地方调用

PreferenceUtil.getInstance().putPreferenceValue(‘name’,‘jack’)

注意PreferenceUtil.ets只能在har包中,在其他har中调用才能是唯一单例。

分享
微博
QQ
微信
回复
2天前
相关问题
HarmonyOS 首选项报错数据报错
190浏览 • 1回复 待解决
HarmonyOS 首选项示例
26浏览 • 1回复 待解决
首选项preferences相关
212浏览 • 1回复 待解决
HarmonyOS 获取首选项取值方式
247浏览 • 1回复 待解决
HarmonyOS TaskPool使用首选项报错
628浏览 • 1回复 待解决
HarmonyOS 首选项回调失效
165浏览 • 1回复 待解决
HarmonyOS 创建首选项报错code:15500000
349浏览 • 1回复 待解决
HarmonyOS 首选项超长string存储失败
167浏览 • 1回复 待解决
HarmonyOS 用户首选项是线程安全
498浏览 • 1回复 待解决
首选项存储问题,为什么会报错?
453浏览 • 1回复 待解决
HarmonyOS 模拟器使用首选项能力异常
281浏览 • 1回复 待解决
首选项获取实例,实例是否为单例
2093浏览 • 1回复 待解决
错误码15500000(首选项)如何处理?
1481浏览 • 1回复 待解决