一键开启 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 存二进制数据(比如加密后的密码🔐)。
  • 删除后遗症:调用 removePreferencesFromCachedeletePreferences 后,必须重新订阅变更!否则 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 超适合轻量持久化~用对了超省心,用错了…嘿嘿,多看看这篇文档吧!有啥问题?评论区见,咱们一起讨论💬👋

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐