Preferences 键值存储 — 轻量级配置数据的持久化方案一、引言在应用开发中大量的配置类数据如用户偏好、开关状态、简单缓存不需要复杂的数据库支持只需要一个轻量级的键值存储方案。鸿蒙系统的 Preferences首选项正是为此类场景设计它以简洁的 API、异步的操作和良好的性能成为配置数据持久化的首选方案。MoneyTrack 在提醒设置、预算金额等场景中大量使用 Preferences实现了配置数据的快速读写和持久化。二、核心知识点2.1 Preferences 完整使用步骤Preferences 的使用遵循「获取实例 → 读写数据 → 刷入磁盘」的标准流程import{preferences}fromkit.ArkDataasyncfunctiondemoPreferences(context:Context){// 第一步获取 Preferences 实例// getPreferences 是异步操作返回 Preferences 对象// 文件名 demo_pref 对应磁盘上的一个 XML 文件constprefawaitpreferences.getPreferences(context,demo_pref)// 第二步写入数据修改在内存中尚未落盘awaitpref.put(username,alice)// stringawaitpref.put(age,25)// numberawaitpref.put(is_vip,true)// booleanawaitpref.put(tags,[premium,yearly])// Arraystring// 第三步刷入磁盘必须显式调用 flush// flush 将内存中的所有修改批量写入磁盘文件awaitpref.flush()// 读取数据需指定默认值防止首次读取返回 undefinedconstusernameawaitpref.get(username,default_user)constageawaitpref.get(age,18)constisVipawaitpref.get(is_vip,false)}关于 flush 的说明flush()是异步批量写入操作调用后不保证立即完成。在应用进入后台或即将退出前调用flush()可确保数据安全。2.2 异步读写流程磁盘 XML内存缓存Preferences API应用层磁盘 XML内存缓存Preferences API应用层其他页面修改数据时getPreferences(context, name)读取 XML 文件返回数据加载到内存缓存返回 Preferences 实例put(key, value)更新内存缓存voidget(key, default)从内存读取valuevalueflush()批量写入磁盘写入完成voidon(change, callback)注册监听触发 change 回调2.3 多实例隔离Preferences 支持基于文件名创建多个独立实例不同模块使用不同的文件实现数据隔离// 不同模块使用独立的 Preferences 文件constreminderPrefawaitpreferences.getPreferences(context,reminder_settings)constthemePrefawaitpreferences.getPreferences(context,theme_settings)constbudgetPrefawaitpreferences.getPreferences(context,budget_settings)// 每个文件独立存储互不干扰awaitreminderPref.put(enabled,true)awaitthemePref.put(theme,dark)awaitbudgetPref.put(monthly_limit,5000)多实例隔离的好处模块间数据解耦修改一个模块的配置不影响其他模块文件粒度的管理方便单独清除某个模块的缓存减少单个文件大小提升读写性能2.4 数据删除操作除了读写Preferences 还提供了数据删除能力// 删除指定的 key-valueawaitpref.delete(temp_setting)// 检查某个 key 是否存在consthasKeyawaitpref.has(reminder_enabled)// 清空所有数据谨慎使用awaitpref.clear()// 删除 Preferences 文件释放磁盘空间awaitpreferences.deletePreferences(context,obsolete_settings)// 注意delete 和 clear 后都需要 flush 才能持久化awaitpref.flush()2.5 数据变更监听Preferences 支持通过on(change)事件监听数据变更这在多页面共享同一配置时特别有用——当某个页面修改了配置其他页面可以实时感知变化并更新 UIpreferences.on(change,(key){if(keyreminder_enabled){this.refreshUI()}})三、项目代码案例3.1 ReminderSettingVM 完整实现在products/entry/src/main/ets/viewmodel/reminder/ReminderSettingVM.ets中ReminderSettingVM 封装了提醒设置的全部逻辑exportclassReminderSettingVM{privatepref:preferences.Preferences|nullnullprivatecontext:Context// 持久化键值privatestaticreadonlyKEY_ENABLEDreminder_enabledprivatestaticreadonlyKEY_TIMEreminder_timeprivatestaticreadonlyKEY_PERIODreminder_periodprivatestaticreadonlyPREF_NAMEreminder_settingsconstructor(context:Context){this.contextcontext}// 初始化加载偏好设置asyncinit():Promisevoid{this.prefawaitpreferences.getPreferences(this.context,ReminderSettingVM.PREF_NAME)// 注册监听this.pref.on(change,(key){console.log(提醒设置变更:,key)})}// 读取提醒是否开启asyncisEnabled():Promiseboolean{returnawaitthis.pref!.get(ReminderSettingVM.KEY_ENABLED,false)}// 设置提醒开关asyncsetEnabled(enabled:boolean):Promisevoid{awaitthis.pref!.put(ReminderSettingVM.KEY_ENABLED,enabled)awaitthis.pref!.flush()}// 读取提醒时间asyncgetReminderTime():Promisestring{returnawaitthis.pref!.get(ReminderSettingVM.KEY_TIME,08:00)}// 设置提醒时间asyncsetReminderTime(time:string):Promisevoid{awaitthis.pref!.put(ReminderSettingVM.KEY_TIME,time)awaitthis.pref!.flush()}}3.2 预算金额持久化在预算管理模块中月度预算金额通过 Preferences 持久化// 键budget_{year}_{month}支持分别存储每个月的预算asyncsaveMonthlyBudget(year:number,month:number,amount:number){constprefawaitpreferences.getPreferences(this.context,budget_settings)constkeybudget_${year}_${month}awaitpref.put(key,amount)awaitpref.flush()}asyncloadMonthlyBudget(year:number,month:number):Promisenumber{constprefawaitpreferences.getPreferences(this.context,budget_settings)constkeybudget_${year}_${month}returnawaitpref.get(key,0)}3.3 使用注意事项及时 flush修改后调用flush()确保数据落盘避免应用退出导致数据丢失默认值使用get()方法时始终提供合理的默认值处理首次使用场景键名规范使用有意义的键名如module_key的命名模式数据量控制Preferences 适合少量配置数据建议不超过 100 个 key大量数据应使用 RDB避免频繁 flush多次 put 后统一 flush 一次减少磁盘 I/O四、参考文档Preferences 首选项指南Preferences API 参考数据存储安全建议
企业数字化 ERP 产品动态
相关推荐
2026全国网站建设公司对比:一个企业官网到底应该解决什么问题? 一、从真实业务问题看市场
企业网站建设常被当成设计项目,讨论集中在风格、配色和首页效果。可一个网站真正上线后,销售关心有没有询盘,市场关心内容能不能更新,品牌关心表达是否一致,管理层关心投入有没有结果。好看当… · 2026/9/24 5:51:17
2026全国企业软件定制公司参考:懂业务的团队,通常更懂怎么做系统 一、从真实业务问题看市场
企业软件定制项目表面上是做系统,实际上是在重新整理组织如何工作。销售说的客户、财务说的客户、售后说的客户可能不是同一个数据对象;管理层希望流程规范,一线员工却担心操作增加。开发团队若只负责把需求文档变成… · 2026/9/24 5:51:17
2026全国AI Agent开发团队盘点:哪些公司已经走出概念验证阶段? 一、从真实业务问题看市场
AI Agent项目最容易制造误判。一个团队用几天时间接入大模型、上传几份文档,就能做出看起来不错的演示;但企业真正使用时,会遇到答案不稳定、权限混乱、数据过期、系统无法调用和责任无法追溯。演示阶段强调“能不能… · 2026/9/21 11:43:34
STM32开源项目:代码+原理图+仿真三位一体,含DHT11与ADC采集 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 5:51:09
告别手动汇总!批量合并Word文档太省事了 经常需要整理大量Word资料的打工人,一定要收下这款小工具! 日常汇总报告、收集作业、整理台账,手动合并又累又容易出错,格式还总乱。这款Word合并神器完美解决痛点,支持多文档一键合并,还能自由调整文件前… · 2026/9/24 5:51:03
2026私有化代码托管平台选型:GitLab、Gitee、Gerrit与Gitea深度对比 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 5:50:33
Linux 常用开发工具:linux-command 私有化部署 引言
背景:开发运维需要大量常用命令和工具,频繁切换在线工具不便核心价值:一站式 Linux 命令查询平台,支持私有化部署适用场景:内部知识库、开发团队工具集、运维文档中心
前置条件
系统要求 Docker 引擎 19.03网络… · 2026/9/24 5:50:02
参数化设计平台技术拆解:从零件级模板库到 BOM 自动生成的完整链路 一、背景:非标设计的数据问题本质
非标装备制造的设计流程有个鲜明特点:约 80% 的结构是重复的,但每个订单都被当成新项目从头走一遍。
由此带来的典型工程问题:现象数据层面的根因设计复用率低、重复建模结构知识没有可复用载体通… · 2026/9/24 5:49:56
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44