033-Preferences键值存储
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 参考数据存储安全建议

相关新闻

终极揭秘:kyclassifier分层算法如何实现openEuler包的智能层级划分

终极揭秘:kyclassifier分层算法如何实现openEuler包的智能层级划分

终极揭秘:kyclassifier分层算法如何实现openEuler包的智能层级划分 【免费下载链接】kyclassifier Use for analyzes layers and categories inforamtion of packages in openEuler. 项目地址: https://gitcode.com/openeuler/kyclassifier 前往项目官网免费…

2026/7/18 0:40:22阅读更多 →
openeuler/kunpeng-competition项目解析:从作品结构到技术亮点

openeuler/kunpeng-competition项目解析:从作品结构到技术亮点

openeuler/kunpeng-competition项目解析:从作品结构到技术亮点 【免费下载链接】kunpeng-competition This reposiroty will hold the submissions of HiKunpeng Copetition openEuler Track. 项目地址: https://gitcode.com/openeuler/kunpeng-competition …

2026/7/18 0:40:22阅读更多 →
tp-libvirt高级功能测试指南:热插拔、迁移和备份测试

tp-libvirt高级功能测试指南:热插拔、迁移和备份测试

tp-libvirt高级功能测试指南:热插拔、迁移和备份测试 【免费下载链接】tp-libvirt Libvirt test provider for virtualization test. It contains a lot of test cases related to such as libvirt/libguestfs. 项目地址: https://gitcode.com/openeuler/tp-libvi…

2026/7/18 0:40:22阅读更多 →
Windows系统合法激活全攻略与安全风险解析

Windows系统合法激活全攻略与安全风险解析

1. Windows激活的合规困境与破解迷思 每次重装系统后那个刺眼的"激活Windows"水印,总让人坐立不安。市面上流传的各种密钥和激活工具,本质上都是游走在法律边缘的灰色方案。我见过太多人因为使用来路不明的激活工具导致系统崩溃,甚…

2026/7/18 1:55:53阅读更多 →
大模型Token计价解析:从技术原理到厂商定价策略对比

大模型Token计价解析:从技术原理到厂商定价策略对比

最近在关注大模型的朋友,可能都注意到了这样一个现象:各大厂商的定价策略越来越让人眼花缭乱。OpenAI、Anthropic、xAI、Meta……每家都在用不同的方式计算token成本,价格差异有时能达到数倍。更让人困惑的是,当我们真正开始使用这…

2026/7/18 1:55:53阅读更多 →
AI大模型token定价策略解析:从技术原理到成本优化实战

AI大模型token定价策略解析:从技术原理到成本优化实战

AI大模型市场竞争日趋激烈,各大厂商的token定价策略差异显著。Chamath Palihapitiya将100万tokens比作"一桶智能",这个比喻生动地揭示了不同AI服务提供商在定价策略上的巨大差异。对于开发者和企业用户来说,理解这些定价差异背后的…

2026/7/18 1:55:53阅读更多 →
H3C交换机办公网Access端口配置实例

H3C交换机办公网Access端口配置实例

这是“H3C交换机中小企业运维实战”专栏的第 6 篇。前面已经完成双链路聚合和 Trunk 配置,这次继续把办公电脑连接的下联端口加入业务 VLAN,并通过终端测试整个接入链路。 本文以 H3C S5570S 和 Comware V7 为例,主办公区使用 VLAN 10&#…

2026/7/18 1:55:53阅读更多 →
Windows 11安装指南:从准备到优化全流程详解

Windows 11安装指南:从准备到优化全流程详解

1. Windows 11安装前的准备工作1.1 系统要求检查在开始安装Windows 11之前,首先要确认你的设备是否符合最低系统要求。微软官方列出的基本硬件要求包括:处理器:1GHz或更快的64位处理器(双核或以上)内存:4GB…

2026/7/18 1:55:53阅读更多 →
NGA论坛浏览体验全面升级:告别杂乱界面,专注核心内容

NGA论坛浏览体验全面升级:告别杂乱界面,专注核心内容

NGA论坛浏览体验全面升级:告别杂乱界面,专注核心内容 【免费下载链接】NGA-BBS-Script NGA论坛增强脚本,给你完全不一样的浏览体验 项目地址: https://gitcode.com/gh_mirrors/ng/NGA-BBS-Script 你是否厌倦了在NGA论坛中面对杂乱无章…

2026/7/18 1:50:53阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/17 10:42:55阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/17 8:31:03阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/17 13:22:23阅读更多 →
从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

更多请点击: https://kaifayun.com 第一章:从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则 在Claude驱动的产品需求文档(PRD)生成实践中,原始业务意图往往以自然语言片…

2026/7/18 0:00:14阅读更多 →
Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

更多请点击: https://codechina.net 第一章:Cursor配置生成失效?3大隐藏陷阱4行修复代码,资深工程师连夜整理的紧急补救清单 Cursor 配置生成突然失效,是近期高频报障场景。表面看是 cursor.config.json 未更新或 LSP…

2026/7/18 0:00:14阅读更多 →
某智驾大牛创业

某智驾大牛创业

作者:钟声编辑:Mark出品:红色星际头图:智能驾驶图片据悉,国内某头部智驾公司端到端模型技术大牛Z投身创业,并且已经拿到融资。Z不仅是该头部公司内部最年轻的对标阿里P10级别技术负责⼈,更是业内…

2026/7/18 0:00:14阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/17 22:48:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/17 13:22:38阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/17 17:26:50阅读更多 →