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_themeuser_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 知识体系总览

下面这张图,帮你把本章的核心逻辑串起来:

Preferences 首选项知识体系 Preferences 首选项 核心概念 轻量级 · Key-Value · 持久化 数据模型 String · Number · Boolean · Array · Object 生命周期 创建 → 读写 → 销毁 存储路径:应用沙箱 /preferences/ 目录 ⚠ 注意:卸载应用 → 数据清除 ⚠ 注意:包名变更 → 数据丢失

2.6 避坑总结

最后,把我这些年踩过的坑,列成清单给你:

  1. 别存大文件——首选项不是数据库,也不是文件系统。超过 1MB 的数据,请考虑用数据库或文件存储
  2. Key 命名要规范——不然项目大了以后,你根本不知道这个 Key 是干嘛用的
  3. 记得调用 flush()——尤其是退出应用前,确保数据已经落盘。不然下次启动时,数据可能还是旧的
  4. 多进程场景要小心——首选项默认不支持多进程并发写。如果多个进程同时写同一个文件,数据可能会乱掉

我的习惯:每次写完数据后,立刻调一次 flush()。虽然会多一次 IO 操作,但换来的是数据安全,值了。

好了,首选项的基础知识就聊到这儿。下一节我们直接上手写代码,看看怎么用 API 实现数据的增删改查。

专注资料整理