数据存储
首选项数据存储
用户首选项为应用提供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);
})