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%')
  }
}

get查询
getAll查询
put
update
上一篇:javascript用来干嘛的?赋予网站灵魂的语言


下一篇:初识算法 · 位运算(end)