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

打印 上一主题 下一主题

主题 1920|帖子 1920|积分 5760

一,用户首选项简述
  1. @ohos.data.preferences (用户首选项)
复制代码
用户首选项为应用提供Key-Value键值型的数据处理惩罚能力,支持应用持久化轻量级数据,并对其修改和查询。
数据存储形式为键值对,键的范例为字符串型,值的存储数据范例包罗数字型、字符型、布尔型以及这3种范例的数组范例。
说明:
本模块首批接口从API version 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
具体详情查看官网,地点:
文档中央
二,常用接口介绍

  • 数据保存(putString)
  • 获取数据(getString)
  • 是否包罗指定的key(has)
  • 数据持久化(flush)
  • 修改数据(update)
  • 删除数据(delete)
  • 清空数据(clear)
 三,创建单列GlobalContext,方便后期可以通过单例直接获取实例;由于get()返回值范例是不确定性,定义一个联合范例的别名ValueType 来接收
  1. export default class GlobalContext {
  2.   private constructor() {
  3.   }
  4.   private static instance: GlobalContext
  5.   private _objects = new Map<string, Object>()
  6.   public static getContext(): GlobalContext {
  7.     if (!GlobalContext.instance) {
  8.       GlobalContext.instance = new GlobalContext()
  9.     }
  10.     return GlobalContext.instance
  11.   }
  12.   getObject(value: string): Object | undefined {
  13.     return this._objects.get(value)
  14.   }
  15.   setObject(key: string, objectClass: Object): void {
  16.     this._objects.set(key, objectClass)
  17.   }
  18. }
复制代码
四,创建PreferencesUtils工具类
  1. import dataPreferences from '@ohos.data.preferences'
  2. import GlobalContext from './GlobalContext'
  3. const TAG = "PreferencesUtils"
  4. // 默认文件名,可以在构造函数进行修改
  5. const PREFERENCES_NAME = 'dbPreferences'
  6. const PREFERENCES_KEY = "preferences"
  7. type ValueType = number | string | boolean | Array<number> | Array<string> | Array<boolean>;
  8. class PreferencesUtils{
  9.   //  preferences的文件名-数据库表名
  10.   private preferencesName: string = PREFERENCES_NAME
  11.   // 用于获取preferences实例的key值,保存到单例中
  12.   private keyPreferences: string = PREFERENCES_KEY
  13.   constructor(name: string = PREFERENCES_NAME, key: string = PREFERENCES_KEY) {
  14.     this.preferencesName = name
  15.     this.keyPreferences = key
  16.   }
  17.   /**
  18.    * 创建首选项实例
  19.    * @param context 应用上下文
  20.    * @returns 数据库表名
  21.    */
  22.   initPreferences(context): Promise<dataPreferences.Preferences> {
  23.     let preferences = dataPreferences.getPreferences(context, this.preferencesName)
  24.     GlobalContext.getContext().setObject(this.keyPreferences, preferences)
  25.     return
  26.   }
  27.   /**
  28.    * 获取首选项实例
  29.    * @returns
  30.    */
  31.   getPreferences(): Promise<dataPreferences.Preferences> {
  32.     return GlobalContext.getContext().getObject(this.keyPreferences) as Promise<dataPreferences.Preferences>
  33.   }
  34.   /**
  35.    * 获取数据
  36.    * @param key 读取key值
  37.    * @param def 函数出参
  38.    * @returns
  39.    */
  40.   async getString(key: string, defaultValue?: ValueType): Promise<ValueType> {
  41.     //在typescript中,空字符串、数字0、null、undefined都被认为是false,其他值为true
  42.     if (!key) {
  43.       return defaultValue
  44.     }
  45.     return (await this.getPreferences()).get(key, defaultValue)
  46.   }
  47.   /**
  48.    * 获取全部数据
  49.    * @returns
  50.    */
  51.   async getAll(): Promise<Object> {
  52.     let preferences = await this.getPreferences()
  53.     if (!preferences) {
  54.       console.debug(TAG+'--->>>[getAll] Preferences实例为空')
  55.       return
  56.     }
  57.     return preferences.getAll()
  58.   }
  59.   /**
  60.    * 插入数据
  61.    * @param key 插入key值
  62.    * @param value 存储数据
  63.    * @returns
  64.    */
  65.   async putString(key: string, defaultValue: ValueType): Promise<void> {
  66.     let promise = await this.getPreferences().then(async preferences => {
  67.       // 插入数据
  68.       await preferences.put(key, defaultValue)
  69.       //写入文件
  70.       await preferences.flush()
  71.     }).catch(error => {
  72.       console.error(TAG, `code:${error.code}, message:${error.message}`)
  73.     })
  74.     return promise
  75.   }
  76.   /**
  77.    * 更新指定key的值
  78.    * @param key  需要更新的key
  79.    * @param newValue 新的值
  80.    * @returns
  81.    */
  82.   async update(key:string, newValue: ValueType):Promise<void>{
  83.     if (!key) {
  84.       throw new Error('Key cannot be empty!');
  85.     }
  86.     const preferences = await this.getPreferences()
  87.     if (await preferences.has(key)) {//检查key是否存在
  88.       await preferences.put(key, newValue); // 更新值
  89.       await preferences.flush(); // 刷新以保存更改
  90.     }else {
  91.       throw new Error(`Key ${key} does not exist`); // 如果key不存在,抛出错误
  92.     }
  93. }
  94.   /**
  95.    * 删除数据
  96.    * @param key 删除key的value值
  97.    * @returns
  98.    */
  99.   async delete(key:string):Promise<void>{
  100.     return (await this.getPreferences()).delete(key).finally(async ()=>{
  101.       (await this.getPreferences()).flush()
  102.     })
  103.   }
  104.   /**
  105.    * 清空数据
  106.    * @returns
  107.    */
  108.   async clear():Promise<void>{
  109.     return (await this.getPreferences()).clear().finally(async ()=>{
  110.       (await this.getPreferences()).flush()
  111.     })
  112.   }
  113. }
  114. export default new PreferencesUtils()
复制代码
五,在EntryAbility中onCreate()方法初始化:
  1. onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
  2.     hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  3.     //TODO 方法初始化
  4.     PreferencesUtils.initPreferences(this.context)
  5.   }
复制代码
六,在pages中使用
  1. import PreferencesUtils from '../dbSQL/PreferencesUtils';
  2. @Entry
  3. @Component
  4. struct Index {
  5.   @State message: string = '';
  6.    aboutToAppear(){
  7.      PreferencesUtils.putString('userName','张三')
  8.      PreferencesUtils.putString('age','18')
  9.      PreferencesUtils.putString('sex','男')
  10.    }
  11.   async getAll(){
  12.     this.message=JSON.stringify(await PreferencesUtils.getAll())
  13.     console.log('getAll', this.message)
  14.   }
  15.   build() {
  16.     Column({space:50}) {
  17.       Text(this.message)
  18.         .fontSize(20)
  19.         .margin({top:30})
  20.         .fontWeight(FontWeight.Bold)
  21.         Column({space:20}){
  22.           Button('getAll').onClick(async ()=>{
  23.             this.getAll()
  24.           })
  25.           Button('put').onClick(async ()=>{//插入数据key相同时,会自动修改替换value值
  26.             PreferencesUtils.putString('userName','李四')
  27.             PreferencesUtils.putString('age','24')
  28.             PreferencesUtils.putString('sex','女')
  29.             this.getAll()
  30.           })
  31.           Button('update').onClick(async ()=>{
  32.             await PreferencesUtils.update('userName','王二麻子')
  33.             await PreferencesUtils.update('age','35')
  34.             await PreferencesUtils.update('sex','男')
  35.             this.getAll()
  36.           })
  37.           Button('delete').onClick(async ()=>{
  38.             await PreferencesUtils.delete('sex')
  39.             this.getAll()
  40.           })
  41.           Button('clear').onClick(async ()=>{
  42.             await PreferencesUtils.clear()
  43.             this.getAll()
  44.           })
  45.         }.margin({top:30})
  46.         .justifyContent(FlexAlign.Center)
  47.     }
  48.     .width('100%')
  49.   }
  50. }
复制代码

   
     getAll查询      
     put      
     update   
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

兜兜零元

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表