Ark TS 用户首选项Preferences实现数据持久化

一、运作机制

二、约束限制

  • Key键为string类型,要求非空且长度不超过80个字节。
  • 如果Value值为string类型,请使用UTF-8编码格式,可以为空,不为空时长度不超过8192个字节。
  • 内存会随着存储数据量的增大而增大,所以存储的数据量应该是轻量级的,建议存储的数据不超过一万条,否则会在内存方面产生较大的开销。

三、接口说明

四、使用尝试

为了更优雅的使用Preferences,我们可以用class定义一个类之后,再去使用

首先在目录common-PreferencesUtil中新建PreferencesUtil.ts

1、定义class

引入Preferences,通过Map来实现多个Preferences场景,内部定义增删改查方法,完成后导出

typescript 复制代码
import preferences from '@ohos.data.preferences';

class PreferencesUtils {
  prefMap: Map<string, preferences.Preferences> = new Map()

  // 加载数据load
  loadPrefenence(context, name: string) {}

  // 新增数据put
  putPreferenceValue(name: string, key: string, value: preferences.ValueType) {}

  // 读取数据get
  getPreferenceValue(name: string, key: string, defaultValue: preferences.ValueType) {}

  // 删除数据del
  delPreferenceValue(name: string,key: string) {}
}

const preferenceUtils = new PreferencesUtils()

export default preferenceUtils as PreferencesUtils
2、完善方法

加载数据

传入上下文context,以及自定义的Preferences名称

typescript 复制代码
// 加载数据load
  async loadPrefenence(context, name: string) {
    try {
      const pref = await preferences.getPreferences(context, name)
      this.prefMap.set(name, pref)
      console.log('testTag', `加载preferences[${name}]成功`)
    }
    catch (e) {
      console.log('testTag', `加载preferences[${name}]失败`, JSON.stringify(e));
    }
  }

新增数据

传入自定义的Preferences名称,需要存储的key-value键值对

put方法在调用的时候,若key已存在则会覆盖原有数据

注意:新增的数据必须调用flush方法,刷盘后,才能实现持久化

typescript 复制代码
// 新增数据put
  async putPreferenceValue(name: string, key: string, value: preferences.ValueType) {
    // 先判断是否存在该名称的键值对
    if (!this.prefMap.has(name)) {
      console.log('testTag', `preferences[${name}]尚未初始化`);
      return
    }
    try {
      const pref = this.prefMap.get(name)
      // 写入数据
      await pref.put(key, value)
      // 刷盘
      await pref.flush()
      console.log('testTag', `保存preferences[${name}]成功`)
    }

    catch (e) {
      console.log('testTag', `保存preferences[${name}]失败`, JSON.stringify(e));
    }
  }

读取数据

传入自定义的Preferences名称,需要读取的key,若首次读取时没有改数据,则给默认数据defaultValue

typescript 复制代码
// 读取数据get
  async getPreferenceValue(name: string, key: string, defaultValue: preferences.ValueType) {
    // 先判断是否存在该名称的键值对
    if (!this.prefMap.has(name)) {
      console.log('testTag', `preferences[${name}]尚未初始化`);
      return
    }
    try {
      const pref = this.prefMap.get(name)

      const value = await pref.get(key, defaultValue)
      console.log('testTag', `读取preferences[${name}.${key}=${value}]成功`)
      return value
    }

    catch (e) {
      console.log('testTag', `读取preferences[${name}]失败`, JSON.stringify(e));
    }
  }

删除数据

传入自定义的Preferences名称,需要删除的key

typescript 复制代码
// 删除数据del
  async delPreferenceValue(name: string,key: string) {
    // 先判断是否存在该名称的键值对
    if (!this.prefMap.has(name)) {
      console.log('testTag', `preferences[${name}]尚未初始化`);
      return
    }
    try {
      const pref = this.prefMap.get(name)
      await pref.delete(key)
      console.log('testTag', `删除preferences[${name}]成功`)
    }
    catch (e) {
      console.log('testTag', `删除preferences[${name}]失败`, JSON.stringify(e));
    }
  }

完成代码如下

typescript 复制代码
import preferences from '@ohos.data.preferences';

class PreferencesUtils {
  prefMap: Map<string, preferences.Preferences> = new Map()

  // 加载数据load
  async loadPrefenence(context, name: string) {
    try {
      const pref = await preferences.getPreferences(context, name)
      this.prefMap.set(name, pref)
      console.log('testTag', `加载preferences[${name}]成功`)
    }
    catch (e) {
      console.log('testTag', `加载preferences[${name}]失败`, JSON.stringify(e));
    }
  }

  // 新增数据put
  async putPreferenceValue(name: string, key: string, value: preferences.ValueType) {
    // 先判断是否存在该名称的键值对
    if (!this.prefMap.has(name)) {
      console.log('testTag', `preferences[${name}]尚未初始化`);
      return
    }
    try {
      const pref = this.prefMap.get(name)
      // 写入数据
      await pref.put(key, value)
      // 刷盘
      await pref.flush()
      console.log('testTag', `保存preferences[${name}]成功`)
    }

    catch (e) {
      console.log('testTag', `保存preferences[${name}]失败`, JSON.stringify(e));
    }
  }

  // 读取数据get
  async getPreferenceValue(name: string, key: string, defaultValue: preferences.ValueType) {
    // 先判断是否存在该名称的键值对
    if (!this.prefMap.has(name)) {
      console.log('testTag', `preferences[${name}]尚未初始化`);
      return
    }
    try {
      const pref = this.prefMap.get(name)

      const value = await pref.get(key, defaultValue)
      console.log('testTag', `读取preferences[${name}.${key}=${value}]成功`)
      return value
    }

    catch (e) {
      console.log('testTag', `读取preferences[${name}]失败`, JSON.stringify(e));
    }
  }

  // 删除数据del
  async delPreferenceValue(name: string, key: string) {
    // 先判断是否存在该名称的键值对
    if (!this.prefMap.has(name)) {
      console.log('testTag', `preferences[${name}]尚未初始化`);
      return
    }
    try {
      const pref = this.prefMap.get(name)
      await pref.delete(key)
      console.log('testTag', `删除preferences[${name}]成功`)
    }
    catch (e) {
      console.log('testTag', `删除preferences[${name}]失败`, JSON.stringify(e));
    }
  }
}

const preferenceUtils = new PreferencesUtils()

export default preferenceUtils as PreferencesUtils
3、使用

在EntryAbility.ts入口文件中,找到onCreate生命周期钩子,初始化Preferences

javascript 复制代码
import PreferencesUtils from '../common/MyPerference/MyPerference'

   async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');

    // 初始化preference
    PreferencesUtils.loadPrefenence(this.context, 'MyPreference')
  }

需要使用的文件中数据读取数据

typescript 复制代码
import PreferencesUtils from '../../common/MyPerference/MyPerference'

  async aboutToAppear() {
    this.isShow = await PreferencesUtils.getPreferenceValue('MyPreference', 'isShow', '') as boolean
  }

put、del方法同理

PS:持久化效果在预览器中不生效,仅在模拟机以及真机中有效

相关推荐
柒儿吖3 小时前
m4宏处理器在鸿蒙PC上的应用指南
华为·harmonyos
讯方洋哥5 小时前
初探HarmonyOS应用
华为·harmonyos
深海的鲸同学 luvi7 小时前
【HarmonyOS】个性化应用图标动态切换详解
华为·harmonyos
奔跑的露西ly8 小时前
【HarmonyOS NEXT】ohpm 安装依赖失败(@finclip 包找不到)问题复盘与解决方案
华为·harmonyos
余生H8 小时前
时光小铺鸿蒙商城上架全复盘 - 鸿蒙2025领航者闯关.成长升级路
华为·harmonyos·鸿蒙2025领航者闯关
鸭蛋超人不会飞10 小时前
鸿蒙OS学习与项目搭建报告
harmonyos
waeng_luo10 小时前
[鸿蒙2025领航者闯关]图标资源统一管理
harmonyos·鸿蒙2025领航者闯关·鸿蒙6实战·开发者年度总结
云上漫步者11 小时前
深度实战:Rust交叉编译适配OpenHarmony PC——unicode_width完整适配案例
开发语言·后端·rust·harmonyos
遇到困难睡大觉哈哈12 小时前
Harmony OS Web 组件:如何在新窗口中打开网页(实战分享)
前端·华为·harmonyos
赵财猫._.12 小时前
React Native鸿蒙开发实战(十):鸿蒙NEXT深度适配与未来展望
react native·react.js·harmonyos