HarmonyOS7 Preferences 轻量存储:配置项管理速查

📅 2026/7/13 4:29:55
HarmonyOS7 Preferences 轻量存储:配置项管理速查
文章目录前言先理解它是什么获取 Preferences 实例存put取get删delete实战记住用户主题选择避坑提醒常见误区小白必踩完整可运行示例Preferences 存配置代码实现写在最后前言不是所有数据都值得上数据库。比如用户是否同意过隐私协议“App 主题选了深色还是浅色”“上次的登录账号”——这些就是几个简单的键值对。这种场景用Preferences首选项最合适轻、快、API 简单像操作一个本地的小字典。这篇文章我把它的增删改查和典型用法讲清楚。先理解它是什么Preferences本质是一个以文件形式存在的键值对存储。你可以把它想象成手机里的一个小本子写着theme dark“agreed true”。关掉 app 再开本子还在。和数据库的区别Preferences 只存简单键值字符串、数字、布尔不支持查询、排序、多表。结构复杂、要检索的数据才用 relationalStore。获取 Preferences 实例import{preferences}fromkit.ArkDataletprefs:preferences.Preferencesasyncfunctioninit(){constcontextgetContext()prefsawaitpreferences.getPreferences(context,myConfig)// 文件名}getPreferences异步返回一个实例后续所有读写都通过它。myConfig是存储文件名不同业务可以用不同文件隔离。存putasyncfunctionsaveTheme(theme:string){awaitprefs.put(theme,theme)// 写入键值awaitprefs.flush()// 必须 flush 才真正落盘}重点写完一定要flush()或flushSync()否则只存在内存里app 一关就没了。这是新手最常漏的一步。取getasyncfunctiongetTheme():Promisestring{constthemeawaitprefs.get(theme,light)// 第二个参数是默认值returnthemeasstring}get的第二个参数是取不到时的默认值。key 不存在就返回它所以你不用先判断是否存在。返回的可能是string | number | boolean用as断言成你要的类型即可。删deleteasyncfunctionclearAgreement(){awaitprefs.delete(agreed)awaitprefs.flush()}删除单个 key 用delete同样记得flush。实战记住用户主题选择Localtheme:stringlightaboutToAppear(){// 启动时读取上次保存的主题this.loadTheme()}asyncloadTheme(){this.themeawaitprefs.get(theme,light)}asynctoggleTheme(){this.themethis.themelight?dark:lightawaitprefs.put(theme,this.theme)awaitprefs.flush()}这样用户切一次深色模式下次打开 app 还是深色——体验上的小细节靠 Preferences 轻松实现。避坑提醒坑现象解决忘了 flush存了但重启没了每次 put/delete 后 flush存大对象性能差、超限大/复杂数据用数据库频繁 flushIO 卡顿批量改完再统一 flush 一次常见误区小白必踩误区说明写完忘了flush()put只存内存不flush关 app 就没了。这是新手最常漏的一步。拿它存大对象Preferences 适合简单键值大/复杂数据请上 relationalStore。频繁flush每次改都落盘会卡 IO批量改完统一flush一次更高效。下面这段代码可以直接复制到 DevEco Studio 里运行。建议你边读边敲改一改文末「动手改一改」里的参数亲眼看看效果。完整可运行示例Preferences 存配置轻量 KV 存储最适合「是否首次启动」「主题开关」这类小配置。代码实现// Preferences轻量键值存储import{preferences}fromkit.ArkDataasyncfunctionsaveTheme(mode:string){constprefawaitpreferences.getPreferences(getContext(),config)awaitpref.put(theme,mode)awaitpref.flush()// 必须 flush 才真正落盘}asyncfunctionreadTheme():Promisestring{constprefawaitpreferences.getPreferences(getContext(),config)returnpref.get(theme,light)asstring}你会看到什么调用saveTheme(dark)后即使杀掉进程再启动readTheme()仍返回dark。这就是「配置项跨会话保留」。动手改一改用pref.delete(theme)清除配置验证回到默认值light。存一个对象先JSON.stringify再put读取时JSON.parse。把config文件名换成user_123体验多命名空间隔离。写在最后Preferences 是小数据的好朋友。判断标准很简单数据简单键值、量小、不需要查询 → 用 Preferences结构复杂要检索 → 用 relationalStore。把你 app 里那些设置项、开关、上次状态都搬进 Preferences再配上flush用户的个性化偏好就能稳稳记住了。