2、Preferences基础:首选项(Preferences)的核心概念、数据模型(Key-Value)、存储路径与生命周期
2.1 什么是首选项?
说白了,首选项就是鸿蒙系统提供的一个轻量级本地存储方案。它专门用来存一些「小数据」——比如用户的设置项、开关状态、上次选择的主题颜色等等。
我刚开始接触鸿蒙开发时,第一反应是:「这不就是 SharedPreferences 吗?」嗯,确实有点像。但鸿蒙的首选项在底层实现上做了不少优化,尤其是在跨设备场景下,它的表现更稳定。
它的核心特点就三个:
- 轻量——只适合存少量数据,别往里面塞大文件
- Key-Value 结构——一个键对应一个值,简单粗暴
- 同步/异步都支持——你可以按需选择读写方式
一句话总结:首选项就是给 App 存「小纸条」用的。每次启动时拿出来看看,关掉时再写回去。
2.2 数据模型:Key-Value 到底怎么玩?
Key-Value 模型,你肯定不陌生。一个 Key 是字符串,Value 可以是多种类型。鸿蒙首选项支持的数据类型有:
| 类型 | 说明 | 示例 |
|---|---|---|
| String | 字符串 | "user_name" → "张三" |
| Number | 数值(整数或浮点) | "volume" → 75 |
| Boolean | 布尔值 | "is_login" → true |
| Array | 数组(需序列化) | "favorites" → ["a","b","c"] |
| Object | 对象(需序列化为 JSON) | "user_info" → {"age":18} |
我个人习惯把 Key 的命名规范统一起来。比如用「模块_字段名」的格式:settings_theme、user_avatar_url。这样后期维护时,一眼就能看出这个 Key 属于哪个模块。
小技巧:Value 存对象时,记得用 JSON.stringify 转成字符串。取出来时再 JSON.parse 还原。我见过有人直接存对象,结果读出来变成 [object Object]……嗯,别问我怎么知道的。
2.3 存储路径:数据到底藏在哪里?
你可能会好奇:「我存进去的数据,到底放在手机哪个位置?」
鸿蒙首选项的数据,默认存储在应用的沙箱目录下。具体路径是:
/data/app/el2/100/base/<包名>/haps/<entry>/files/preferences/
这个路径你平时开发时基本不用管,系统会自动管理。但有一点要注意:首选项文件是跟着应用走的。卸载应用时,这些数据会被一并清除。
我记得有一次,测试同事反馈说「为什么我升级版本后,用户的设置丢了?」排查了半天,发现是包名变了……嗯,包名一变,路径就变了,数据自然就找不到了。
避坑指南:千万不要手动去修改沙箱里的首选项文件。我曾经手痒试过一次,结果应用直接崩溃——文件格式被破坏了。老老实实用 API 操作吧。
2.4 生命周期:数据什么时候生,什么时候死?
首选项的生命周期,说白了就三个阶段:
- 创建——当你第一次调用
getPreferences()时,如果文件不存在,系统会自动创建 - 读写——整个应用运行期间,你可以随时读写数据
- 销毁——应用卸载时,数据被清除。或者你主动调用
deletePreferences()删除
这里有个细节:首选项的数据是持久化的。也就是说,你关掉应用再打开,数据还在。除非你主动删了它。
为什么会这样?因为系统在每次 flush() 或 put() 后,会把数据同步写入磁盘文件。所以不用担心断电丢数据的问题。
核心要点:首选项的生命周期 = 应用的安装周期。应用在,数据在;应用走,数据走。
2.5 知识体系总览
下面这张图,帮你把本章的核心逻辑串起来:
2.6 避坑总结
最后,把我这些年踩过的坑,列成清单给你:
- 别存大文件——首选项不是数据库,也不是文件系统。超过 1MB 的数据,请考虑用数据库或文件存储
- Key 命名要规范——不然项目大了以后,你根本不知道这个 Key 是干嘛用的
- 记得调用 flush()——尤其是退出应用前,确保数据已经落盘。不然下次启动时,数据可能还是旧的
- 多进程场景要小心——首选项默认不支持多进程并发写。如果多个进程同时写同一个文件,数据可能会乱掉
我的习惯:每次写完数据后,立刻调一次 flush()。虽然会多一次 IO 操作,但换来的是数据安全,值了。
好了,首选项的基础知识就聊到这儿。下一节我们直接上手写代码,看看怎么用 API 实现数据的增删改查。