HarmonyOS开发之数据存储—首选项数据存储

数据存储

首选项数据存储

​ 用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。当用户希望有一个全局唯一存储的地方,可以采用用户首选项来进行存储。Preferences会将该数据缓存在内存中,当用户读取的时候,能够快速从内存中获取数据,当需要持久化时可以使用flush接口将内存中的数据写入持久化文件中。Preferences会随着存放的数据量越多而导致应用占用的内存越大,因此,Preferences不适合存放过多的数据,也不支持通过配置加密,适用的场景一般为应用保存用户的个性化设置(字体大小,是否开启夜间模式)等。

​ 数据最终存储在系统文件中,提供对底层文件的封装,将其映射成Preferences实例对象

在这里插入图片描述

可使用回调方式与Promise方式获取Preferences实例

导入模块:

import { preferences } from '@kit.ArkData';

let preference: Promise<preferences.Preferences> =
preferences.getPreferences(context, PREFERENCES_NAME)

以下提供一种基于Promise的存储实例

1.声明全局对象,提供Map集合存放获取Preferences实例的函数与存入的键值对数据:

export class GlobalContext{
  private constructor() {
  }
  private static instance:GlobalContext
  private tool_map= new Map<string,Object>()

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

  getValue(value:string){
    return this.tool_map.get(value)
  }

  setMap(key:string,value:Object){
    this.tool_map.set(key,value)
  }
}

2.定义工具类,存放创建实例的方法以及增删取的方法

import { preferences } from '@kit.ArkData';
import { GlobalContext } from './GlobalContext';
import { Context } from '@ohos.abilityAccessCtrl';
import Logger from './Logger';

const TAG = '[PreferencesUtil]';
const PREFERENCES_NAME = 'myPreferences';
const KEY_APP_FONT_SIZE = 'appFontSize';

export class PrefUtil {
  //在EntryAbility中使用this.context 创建一个获取Preference对象的函数fontPreferences()
  createFontPreferences(context: Context) {
    let fontPreferences: Function = (() => {
      let preference: Promise<preferences.Preferences> = preferences.getPreferences(context, PREFERENCES_NAME)
      return preference
    })
  //保存在全局唯一的单例对象GlobalContext的_objects Map中,键为PREFERENCES_NAME,值为刚刚创建的函数
    GlobalContext.getContext().setMap(PREFERENCES_NAME, fontPreferences)
  }

  saveChangeFontSize(fontSize: number) {
  //获取createFontPreferences中创建好的返回Promise的fontPreferences()函数,并将值赋给getFontPreferences
    let getFontPreferences: Function = GlobalContext.getContext().getValue(PREFERENCES_NAME) as Function
    getFontPreferences().then(async (preferences: preferences.Preferences) => {
      await preferences.put(KEY_APP_FONT_SIZE, fontSize)
      preferences.flush()
    }).catch((err: Error) => {
      Logger.error(TAG, 'put the preferences failed, err: ' + err);

    });
  }

  async getChangeFontSize():Promise<number> {
      let fontSize: number = 0;
      let getFontPreferences: Function = GlobalContext.getContext().getValue(PREFERENCES_NAME) as Function
      fontSize = await (await getFontPreferences()).get(KEY_APP_FONT_SIZE, fontSize)
      return fontSize
  }

  async deleteChangeFontSize(){
    let getFontPreferences=GlobalContext.getContext().getValue(PREFERENCES_NAME) as Function
    const preference:preferences.Preferences=await getFontPreferences()
    //await preference.delete(KEY_APP_FONT_SIZE)
    let deleteValue=preference.delete(KEY_APP_FONT_SIZE)
    deleteValue.then(()=>{
      Logger.info(TAG, 'Succeeded in deleting the key appFontSize.');
    }).catch((err:Error)=>{
      Logger.error(TAG, 'Failed to delete the key appFontSize. Cause: ' + err);
    })
  }

}
export default new PrefUtil()

3.在UIAbility中使用全局对象以及获取的上下文this.context创建Preferences实例

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

4.页面中使用生命周期方法onPageShow()取出存储的信息

onPageShow(){
    PrefUtil.getChangeFontSize().then((value:number) => {
      this.saveSize = value;
      Logger.info(TAG, 'Get the value of changeFontSize: ' + this.saveSize);
    })
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值