鸿蒙Next(HarmonyOS NEXT)的用户首选项(Preferences)是为应用提供的一种轻量级数据持久化解决方案,它允许开发者以键值对的形式存储和检索数据。这种机制非常适合用于保存用户的个性化设置或应用的配置信息,例如主题颜色、字体大小、是否开启夜间模式等
特点
- 轻量级:用户首选项主要用于存储少量的数据,不适合用来存储大量的数据集。这是因为所有数据会被加载到内存中,过多的数据可能导致内存占用过高。建议分文件存储(如 uesrFile、configFile等)
- 快速访问:由于数据被缓存在内存中,因此读取速度非常快
- 同步与异步操作:提供了同步和异步两种方式来处理数据的读写操作
- 支持多种数据类型:键的类型为字符串型(不能重复),值的存储数据类型包括数字型、字符型、布尔型以及这3种类型的数组类型(注: 这是一道鸿蒙基础认证考题)
Preferences 封装
对用户首选项进行封装,主要消除模版代码,提供下面几个能力
- 传入 fileName,获取指定的用户首选项
- 提供存储、删除、清空数据封装方法
提供 getConfig,使用泛型,进行数据转换
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() { 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 })
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。