鸿蒙Next(HarmonyOS NEXT)的用户首选项(Preferences)是为应用提供的一种轻量级数据持久化解决方案,它允许开发者以键值对的形式存储和检索数据。这种机制非常适合用于保存用户的个性化设置或应用的配置信息,例如主题颜色、字体大小、是否开启夜间模式等
特点
- 轻量级:用户首选项主要用于存储少量的数据,不适合用来存储大量的数据集。这是因为所有数据会被加载到内存中,过多的数据可能导致内存占用过高。建议分文件存储(如 uesrFile、configFile等)
- 快速访问:由于数据被缓存在内存中,因此读取速度非常快
- 同步与异步操作:提供了同步和异步两种方式来处理数据的读写操作
- 支持多种数据类型:键的类型为字符串型(不能重复),值的存储数据类型包括数字型、字符型、布尔型以及这3种类型的数组类型(注: 这是一道鸿蒙基础认证考题)
Preferences 封装
import { preferences } from '@kit.ArkData'
import { hilog } from '@kit.PerformanceAnalysisKit'
import { BusinessError } from '@kit.BasicServicesKit';
const TAG: string = 'PreferenceUtil'
const CONFIG_FILE_NAME = 'configPreference' // 文件名
const FONT_SIZE_KEY = 'font_size_key' // key
const IS_FIRST_OPEN = 'is_first_open' // key
class PreferenceUtil {
private _preference?: preferences.Preferences | undefined;
getPreferenceFile(context: Context, fileName: string) {
this._preference = preferences.getPreferencesSync(context, { name: fileName })
return this
}
// 获取首选项实例
getConfigPreference(context: Context): PreferenceUtil {
return this.getPreferenceFile(context, CONFIG_FILE_NAME)
}
// 保存信息,传入key、value
saveConfig(key: string, value: preferences.ValueType) {
this._preference?.putSync(key, value)
this._preference?.flush((err: BusinessError) => {
if (err) {
hilog.error(0x000, TAG, 'save config failed code =' + err.code + ', message =' + err.message)
} else hilog.info(0x000, TAG, 'save config success')
})
}
// 删除 key
deleteKey(key: string) {
this._preference?.deleteSync(key)
this._preference?.flush((err: BusinessError) => {
if (err) {
hilog.error(0x000, TAG, 'delete config failed code =' + err.code + ', message =' + err.message)
} else hilog.info(0x000, TAG, 'delete config success')
})
}
// 清除首选项内容
clearPreference() {
this._preference?.clearSync()
this._preference?.flush((err: BusinessError) => {
if (err) {
hilog.error(0x000, TAG, 'clear config failed code =' + err.code + ', message =' + err.message)
} else hilog.info(0x000, TAG, 'clear config success')
})
}
// T 泛型,返回该类型数据
private getConfig<T>(name: string, defValue: preferences.ValueType): T {
return this._preference?.getSync(name, defValue) as T
}
getIsFirstOpen() {
return this.getConfig<boolean>(IS_FIRST_OPEN, false)
}
saveChangeFontSize(value: number) {
this.saveConfig(FONT_SIZE_KEY, value)
}
getChangeFontSize() {
return this.getConfig<number>(FONT_SIZE_KEY, 0)
}
}
export default new PreferenceUtil()
使用方式(示例)
在 aboutToAppear 中,取出对应字段
// 获取 字体大小 配置
aboutToAppear() {
let context = this.getUIContext().getHostContext()
if (context) {
PreferenceUtil.getConfigPreference(context)
this.fontSizeOffset = PreferenceUtil.getChangeFontSize()
}
}
// ... 省略代码
// 保存 字体大小 配置
Button('确认')
.width('156vp')
.height('41vp')
.margin({right: '16vp'})
.onClick(() => {
PreferenceUtil.saveChangeFontSize(13)
this.fontSizeOffset = this.currentValue
})