Administrator
发布于 2024-05-07 / 22 阅读
0
0

鸿蒙开发-首选项Preferences

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V2/data-persistence-by-preferences-0000001505432513-V2#section128216613314

用户首选项运作机制

将用户首选项持久化文件的内容加载到Preferences实例,每个文件唯一对应到一个Preferences实例,系统会通过静态容器将该实例存储在内存中,直到主动从内存中移除该实例或者删除该文件。

约束限制

  • Key键为string类型,要求非空且长度不超过80个字节。

  • 如果Value值为string类型,可以为空,不为空时长度不超过8192个字节。

  • 内存会随着存储数据量的增大而增大,所以存储的数据量应该是轻量级的,建议存储的数据不超过一万条,否则会在内存方面产生较大的开销。

工具类的编写和使用

import preferences from '@ohos.data.preferences';

class PreferencesUtils {
  prefMap :Map<string,preferences.Preferences> = new Map()
	//加载文件
   async loadPreference(context , name:string){
     try {
       const pref = await preferences.getPreferences(context,name)
       this.prefMap.set(name,pref)
       console.log("testTag", `加载Preferences${name}成功`);
     } catch (reason) {
       console.log("testTag", `加载Preferences${name}失败`, JSON.stringify(reason));
     }
     
  }
  
//存key-value值
  async putPreferenceValue(name:string ,key:string ,value :preferences.ValueType){
    if (!this.prefMap.has(name)) {
      console.log("testTag", `Preferences${name}尚未初始化`);
      return
    }
    try {

      let pref =  this.prefMap.get(name)
      await pref?.put(key,value)
      await pref?.flush()
      console.log("testTag", `保存Preferences${name}.${key} = ${value}成功`);
    }catch (e){
      console.log("testTag", `保存Preferences${name}.${key} = ${value}失败`);
    }
  }

  
//取key-value值
  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}.${key} 失败`);
    }
  }

//删除
  async deletePreferenceValue(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}.${key} 成功`);
    }catch (e){
      console.log("testTag", `删除Preferences${name}.${key} 失败`);
    }
  }

//从内存中移除指定的Preferences实例。若Preferences实例有对应的持久化文件,则同时删除其持久化文件。
  async deletePreference(context ,name:string ){
    if (this.prefMap.has(name)) {
      this.prefMap.delete(name)
    }
    await preferences.deletePreferences(context, name)
  }

}

const preferencesUtil = new PreferencesUtils()
export default preferencesUtil as PreferencesUtils

在入口ability中,初始化,加载preference文件

import PreferencesUtils from "../utils/PreferencesUtils"

export default class EntryAbility extends UIAbility {
  async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): Promise<void> {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
    //加载 Preference 首选项 文件
    await PreferencesUtils.loadPreference(this.context ,"MyPreferences")
  }
} 

使用

import PreferencesUtils from "../utils/PreferencesUtils"


@Entry
@Component
struct Index {
	@State isOpen: boolean = false ;

	  async aboutToAppear() {
		//初始化数据
	    this.isOpen = await PreferencesUtils.getPreferenceValue("MyPreferences","isOpen" ,false) as boolean
	  }

	build(){
		Column() {
    
      		Toggle({ type: ToggleType.Switch, isOn: this.isOpen }).onChange(isOn =>{
			//更改首选项中的值
         	PreferencesUtils.putPreferenceValue("MyPreferences","isOpen" ,isOn)
        	this.isOpen = isOn
      })
    }
    .height('100%')
    .width('100%')
	}


评论