用户首选项运作机制
将用户首选项持久化文件的内容加载到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%')
}