HarmonyOS Preferences 数据持久化指南
帮你划终极重点!打印出来贴墙上,开发不迷路~关键点XML 模式GSKV 模式通用提醒适用场景单进程小数据多进程高并发数据 ≤50MB 为佳核心操作写入后手动flush()写入自动落盘Key 长度 ≤1024 字节最大风险文件损坏(多进程)平台不支持时崩溃Value 长度 ≤16MB安全必须Uint8Array 存二进制数据敏感数据加密!🚨🎉一句话收尾:Preferences 超适合轻量持久化~
一键开启 HarmonyOS Preferences 数据持久化指南!
##Harmony OS Next ##Ark Ts ##教育
🔥 一、场景与机制:啥时候用它?怎么运作?
应用场景 🛋️
Preferences 最适合那些轻量级的键值型数据,就像你手机里的偏好设置——用户调个字体大小、切换夜间模式,或者保存用户的皮肤主题设置💡。比如,用户设置了个 “字体大小=16px”,你就能用它快速存下来,下次 App 启动时自动加载,省心又高效!如果数据量太大?那我劝你别用它,咱们有更高级的解决方案(比如数据库),但这个小家伙对付日常小需求那是杠杠滴👍。
运作机制 ⚙️
它靠的是 ArkTS 的接口来读写数据文件。简单讲:每个 Preferences 实例对应一个数据文件,这些文件都藏在应用沙箱里(安全又隐私🔒!)。你完全不用担心怎么找文件路径——直接调用 context 就搞定啦!比如,读取时系统自动映射文件位置,写入时内存里操作,需要时才持久化(后面会细说为啥这么设计)。是不是像在玩积木?一个个模块拼起来,超级直观!
📊 二、存储模式大 PK!XML vs GSKV 🥊
Preferences 支持两种存储模式,选谁完全看你的 App 需求!下面这个表格给你秒懂对比,看完就知道怎么选了👇:
| 模式 | XML 存储(默认模式) | GSKV 存储(API 18+) |
|---|---|---|
| 数据格式 | XML 文件格式 | 原生文件格式 |
| 核心特点 | 跨平台兼容性好,但内存操作需手动 flush() |
多进程并发读写无敌✨,写入立刻落盘超快! |
| 适用场景 | 单进程、小数据量(建议 ≤50MB)🚫多进程别用 | 多进程并发场景🏃♂️🚶♂️,抢资源不怕崩! |
| 最大限制 | 不支持多进程并发(乱来会文件损坏😱) | 只支持当前平台,必须先用 isStorageTypeSupported() 检查! |
👉 小贴士:XML 是老熟人,兼容性好但别贪多进程;GSKV 是新晋神速王,但要确保设备支持哟~
🛑 三、约束限制:避坑指南 ⚠️
哎呀,编程不踩坑不算真勇士!Preferences 虽好用,但有硬规矩你必须知道。下面分点聊,保你一路顺风~
1. 通用限制(谁都不能犯)
- Key 的规矩:必须是非空字符串,长度不超过 1024 字节。别瞎填数字或空值,会报错的!
- Value 的限制:如果是字符串,得用 UTF-8 编码(否则乱码警告),长度上限 16MB——放个小图片还行,大片就歇菜了;也支持 Uint8Array 存二进制数据(比如加密后的密码🔐)。
- 删除后遗症:调用
removePreferencesFromCache或deletePreferences后,必须重新订阅变更!否则 App 傻傻不知道数据改了🤷♂️。 - 安全警告:数据没加密!敏感信息得你自己先加密(用 AES 之类的)再用 Uint8Array 存。懒了?用户数据泄露了你赔不起啊⚠️。
2. XML 模式特有坑位
- 进程安全?别指望!不保证多进程并发安全——两个进程同时改文件?恭喜你,文件可能碎一地💔。
- 非 UTF-8 字符串咋办?硬转!必须用 Uint8Array 包装才能存。
- 大数据量灾难:如果存太多(>50MB),主线程会卡成 PPT!用户点个按钮等十秒?差评预订🤦♂️。
3. GSKV 模式坑点合集
- 平台限制:只活在 HarmonyOS 里!安卓 iOS 不理你,一定要先用
isStorageTypeSupported()查兼容性。 - 并发删除风险:千万别和
deletePreferences同时调用!系统忙不过来可能炸毛🤯。
🧰 四、核心接口:你的工具箱大全 🔧
Preferences 的接口超级简单,就像乐高积木~随手拼就好!下面表格给你整理核心接口和用法说明,收藏了慢慢看👀:
| 接口名称 | 功能描述 |
|---|---|
getPreferencesSync |
获取 Preferences 实例!可选存储模式(XML 或 GSKV),核心入口点🏁。 |
putSync / put |
同步或异步写入数据(如 putSync('theme', 'dark'))。XML 模式需手动 flush() |
flush |
XML 模式专属!内存数据刷到文件📁,持久化全靠它👏。 |
on('change', callback) |
订阅数据变更事件(如监听主题颜色变化)。XML 需 flush() 触发,GSKV 实时响应 |
deletePreferences |
删除实例和文件⚠️!GSKV 模式别并发调,小心冲突。 |
👉 示例小剧场:用 putSync 存个字体大小,XML 模式后记得 flush();用 on('change') 就能实时抓用户操作!
🧭 五、开发步骤:手把手教程 🎯
来,咱们实战走起!5步搞定 Preferences 应用,超级简单(代码有惊喜在后面😉)。
1️⃣ 导入模块:万事开头易
导入 ArkData 的 preferences 模块,一行代码搞定:
import { preferences } from '@kit.ArkData';
这就像开工具箱前找螺丝刀,必备第一步!
2️⃣ 选择存储模式:XML or GSKV?
-
默认 XML:啥都不写就它了~懒人福音🍔。
切换 GSKV
(API 18+ 设备):必须两步走——先查兼容性,再创建实例!
// 先查设备是否支持 GSKV
const isSupported = preferences.isStorageTypeSupported(preferences.StorageType.GSKV);
if (isSupported) {
// 创建实例:指定名字和存储类型
let options = { name: 'myAppStore', storageType: preferences.StorageType.GSKV };
let dataPrefs = preferences.getPreferencesSync(context, options);
}
🧠
提示
:不支持 GSKV 就乖乖用 XML 吧~
3️⃣ 数据操作三部曲:写、读、删
写入数据
:
putSync
搞定同步写入(XML 模式后必调
flush()
!
dataPrefs.putSync('fontSize', 16); // 存个数字值
dataPrefs.flush(); // XML 专属,别忘!
读取数据
:
getSync
一招解决(二进制数据用 Uint8Array 再解码📊)。
let fontSize = dataPrefs.getSync('fontSize', 14); // 14 是默认值
删除键值
:
deleteSync
扫垃圾🚮,不留痕迹~
dataPrefs.deleteSync('oldTheme'); // 再见,过时设置!
4️⃣ 持久化与变更订阅:自动化秘籍🤖
-
XML 模式:手动是美德!写数据后调用
flush(),变更订阅也靠它触发。
GSKV 模式
:爽快人设计!写入立刻落盘,变更实时通知回调💨。
dataPrefs.on('change', (key) => {
console.info(`${key} changed! Update UI now~`); // 实时响应主题变化
});
5️⃣ 删除文件:彻底告别👋
用 deletePreferences 核删文件,一去不回!
preferences.deletePreferences(context, options, (err) => {
if (err) console.error('删除失败!');
else console.log('文件已粉碎💥');
});
⚠️ 警告:删了就没了!恢复不了,三思而后行哟~
🧪 六、示例代码片段:抄作业专区 ✍️
看烦了文字?直接撸代码吧!下面是个完整的 GSKV 模式示例(记得先检查兼容性哈):
// 步骤1: 获取 GSKV 实例(前提: 设备支持!)
let options = { name: 'userConfig', storageType: preferences.StorageType.GSKV };
let dataPreferences = preferences.getPreferencesSync(this.context, options);
// 步骤2: 写入数据(GSKV 自动持久化,不用 flush() 爽!)
dataPreferences.putSync('theme', 'dark'); // 存个主题值
dataPreferences.putSync('notifications', true); // 再存个布尔值
// 步骤3: 订阅变更(GSKV 实时触发回调)
dataPreferences.on('change', (key) => {
console.info(`🎉 数据更新啦:${key} changed!`); // 活泼点加个 emoji!
});
// 步骤4: 读取数据
let savedTheme = dataPreferences.getSync('theme', 'light'); // 'light' 是默认
console.log(`当前主题是:${savedTheme} 🌙`);
👆 这代码复制粘贴就能跑!XML 模式?把 storageType 去掉,加个 flush() 就行~
🚨 七、注意事项:终极生存法则 ⚔️
最后送个避雷包!玩 Preferences 别忽略这些,否则 App 崩了别怪我哟~
- XML 模式禁忌:
- 🚫 别碰多进程!两个 App 同时读写?文件秒损坏,用户哭晕😭。
- 🚫 大数据量绕道!数据超过 50MB?主线程卡死,体验归零。
- 🛠️ 非 UTF-8 字符串?硬核包装进 Uint8Array,别偷懒!
- GSKV 模式要务:
- ✅ 必查兼容性!设备不支持 GSKV?乖乖 fallback 回 XML。
- 🚫 避免并发删!调
deletePreferences时,其他操作全停住。
- 安全红线 🔐:
- 敏感数据(如用户密码)必须先加密再存 Uint8Array。明文存?黑客开香槟🎉了!
- 定期检查文件权限,防未授权访问(HarmonyOS 沙箱帮了忙,但用户误操作也得防)。
🎯 总结表格:一键收藏重点 🗂️
帮你划终极重点!打印出来贴墙上,开发不迷路~
| 关键点 | XML 模式 | GSKV 模式 | 通用提醒 |
|---|---|---|---|
| 适用场景 | 单进程小数据 | 多进程高并发 | 数据 ≤50MB 为佳 |
| 核心操作 | 写入后手动 flush() |
写入自动落盘 | Key 长度 ≤1024 字节 |
| 最大风险 | 文件损坏(多进程) | 平台不支持时崩溃 | Value 长度 ≤16MB |
| 安全必须 | Uint8Array 存二进制数据 | isStorageTypeSupported |
敏感数据加密!🚨 |
🎉 一句话收尾:Preferences 超适合轻量持久化~用对了超省心,用错了…嘿嘿,多看看这篇文档吧!有啥问题?评论区见,咱们一起讨论💬👋
更多推荐


所有评论(0)