HarmonyOS本地存储-Preferences(用户首选项)的使用

一,用户首选项简述

复制代码
@ohos.data.preferences (用户首选项)

用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。

数据存储形式为键值对,键的类型为字符串型,值的存储数据类型包括数字型、字符型、布尔型以及这3种类型的数组类型。

说明:

本模块首批接口从API version 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。

具体详情查看官网,地址:

文档中心

二,常用接口介绍

  1. 数据保存(putString)
  2. 获取数据(getString)
  3. 是否包含指定的key(has)
  4. 数据持久化(flush)
  5. 修改数据(update)
  6. 删除数据(delete)
  7. 清空数据(clear)

三,创建单列GlobalContext,方便后期可以通过单例直接获取实例;由于get()返回值类型是不确定性,定义一个联合类型的别名ValueType 来接收

复制代码
export default class GlobalContext {
  private constructor() {
  }

  private static instance: GlobalContext
  private _objects = new Map<string, Object>()

  public static getContext(): GlobalContext {
    if (!GlobalContext.instance) {
      GlobalContext.instance = new GlobalContext()
    }
    return GlobalContext.instance
  }

  getObject(value: string): Object | undefined {
    return this._objects.get(value)
  }

  setObject(key: string, objectClass: Object): void {
    this._objects.set(key, objectClass)
  }
}

四,创建PreferencesUtils工具类

复制代码
import dataPreferences from '@ohos.data.preferences'
import GlobalContext from './GlobalContext'

const TAG = "PreferencesUtils"
// 默认文件名,可以在构造函数进行修改
const PREFERENCES_NAME = 'dbPreferences'
const PREFERENCES_KEY = "preferences"
type ValueType = number | string | boolean | Array<number> | Array<string> | Array<boolean>;



class PreferencesUtils{


  //  preferences的文件名-数据库表名
  private preferencesName: string = PREFERENCES_NAME
  // 用于获取preferences实例的key值,保存到单例中
  private keyPreferences: string = PREFERENCES_KEY



  constructor(name: string = PREFERENCES_NAME, key: string = PREFERENCES_KEY) {
    this.preferencesName = name
    this.keyPreferences = key
  }


  /**
   * 创建首选项实例
   * @param context 应用上下文
   * @returns 数据库表名
   */
  initPreferences(context): Promise<dataPreferences.Preferences> {
    let preferences = dataPreferences.getPreferences(context, this.preferencesName)
    GlobalContext.getContext().setObject(this.keyPreferences, preferences)
    return
  }

  /**
   * 获取首选项实例
   * @returns
   */
  getPreferences(): Promise<dataPreferences.Preferences> {
    return GlobalContext.getContext().getObject(this.keyPreferences) as Promise<dataPreferences.Preferences>
  }

  /**
   * 获取数据
   * @param key 读取key值
   * @param def 函数出参
   * @returns
   */
  async getString(key: string, defaultValue?: ValueType): Promise<ValueType> {
    //在typescript中,空字符串、数字0、null、undefined都被认为是false,其他值为true
    if (!key) {
      return defaultValue
    }
    return (await this.getPreferences()).get(key, defaultValue)
  }

  /**
   * 获取全部数据
   * @returns
   */
  async getAll(): Promise<Object> {
    let preferences = await this.getPreferences()
    if (!preferences) {
      console.debug(TAG+'--->>>[getAll] Preferences实例为空')
      return
    }
    return preferences.getAll()
  }

  /**
   * 插入数据
   * @param key 插入key值
   * @param value 存储数据
   * @returns
   */
  async putString(key: string, defaultValue: ValueType): Promise<void> {

    let promise = await this.getPreferences().then(async preferences => {
      // 插入数据
      await preferences.put(key, defaultValue)
      //写入文件
      await preferences.flush()
    }).catch(error => {
      console.error(TAG, `code:${error.code}, message:${error.message}`)
    })
    return promise
  }

  /**
   * 更新指定key的值
   * @param key  需要更新的key
   * @param newValue 新的值
   * @returns
   */
  async update(key:string, newValue: ValueType):Promise<void>{
    if (!key) {
      throw new Error('Key cannot be empty!');
    }
    const preferences = await this.getPreferences()
    if (await preferences.has(key)) {//检查key是否存在
      await preferences.put(key, newValue); // 更新值
      await preferences.flush(); // 刷新以保存更改
    }else {
      throw new Error(`Key ${key} does not exist`); // 如果key不存在,抛出错误
    }

}




  /**
   * 删除数据
   * @param key 删除key的value值
   * @returns
   */
  async delete(key:string):Promise<void>{
    return (await this.getPreferences()).delete(key).finally(async ()=>{
      (await this.getPreferences()).flush()
    })
  }

  /**
   * 清空数据
   * @returns
   */
  async clear():Promise<void>{
    return (await this.getPreferences()).clear().finally(async ()=>{
      (await this.getPreferences()).flush()
    })
  }
}

export default new PreferencesUtils()

五,在EntryAbility中onCreate()方法初始化:

复制代码
 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
    //TODO 方法初始化
    PreferencesUtils.initPreferences(this.context)

  }

六,在pages中使用

复制代码
import PreferencesUtils from '../dbSQL/PreferencesUtils';

@Entry
@Component
struct Index {
  @State message: string = '';

   aboutToAppear(){
     PreferencesUtils.putString('userName','张三')
     PreferencesUtils.putString('age','18')
     PreferencesUtils.putString('sex','男')
   }

  async getAll(){
    this.message=JSON.stringify(await PreferencesUtils.getAll())
    console.log('getAll', this.message)
  }


  build() {
    Column({space:50}) {
      Text(this.message)
        .fontSize(20)
        .margin({top:30})
        .fontWeight(FontWeight.Bold)

        Column({space:20}){
          Button('getAll').onClick(async ()=>{
            this.getAll()
          })

          Button('put').onClick(async ()=>{//插入数据key相同时,会自动修改替换value值
            PreferencesUtils.putString('userName','李四')
            PreferencesUtils.putString('age','24')
            PreferencesUtils.putString('sex','女')
            this.getAll()
          })


          Button('update').onClick(async ()=>{
            await PreferencesUtils.update('userName','王二麻子')
            await PreferencesUtils.update('age','35')
            await PreferencesUtils.update('sex','男')
            this.getAll()
          })


          Button('delete').onClick(async ()=>{
            await PreferencesUtils.delete('sex')
            this.getAll()
          })

          Button('clear').onClick(async ()=>{
            await PreferencesUtils.clear()
            this.getAll()
          })
        }.margin({top:30})
        .justifyContent(FlexAlign.Center)
    }
    .width('100%')
  }
}

getAll查询 put update

相关推荐
黑臂麒麟14 分钟前
Harmony鸿蒙实战应用10:随手账本——发布检查与最终验收
华为·app·arkts·鸿蒙
贾伟康1 小时前
【天体运行模拟|16】HarmonyOS ArkTS 多设备布局实战:适配手机、平板和 PC/2in1 的窗口变化
harmonyos·arkts·arkui·响应式布局·多设备适配
黑臂麒麟1 小时前
HarmonyOS鸿蒙实战应用6:随手账本——Preferences本地持久化
数据库·华为·app·鸿蒙
大雷神1 小时前
HarmonyOS AR Engine高精几何重建实战——扫描纸盒并测量体积
华为·ar·harmonyos
用户0934077735141 小时前
HarmonyOS WPS Open SDK 实践:registerApp 鉴权与就绪门禁
android·typescript·harmonyos
特立独行的猫a2 小时前
仓颉语言原生 Coding Agent:cjh · 仓颉语言实现的 Harness
ai·agent·harmonyos·仓颉·cangjie·harness
大锅盖12 小时前
警示橙如何驱动巡检闭环?ArkUI 物业安全平台的声明式实现
安全·华为·harmonyos
贾伟康2 小时前
【时光清单|03】HarmonyOS ArkTS 提醒服务实战:计算触发时间并防止重复注册
harmonyos·arkts·后台任务·幂等设计·通知提醒
李蚊子2 小时前
从代理提醒到真实响铃:懒熊闹钟的鸿蒙开发实践
前端·harmonyos
GKxx2 小时前
在 HarmonyOS 上从源码构建 GCC 16(gcc/g++ + libstdc++ + libsanitizer):完整记录
c++·华为·harmonyos·鸿蒙·gcc