[HarmonyOS][K老师]鸿蒙首选项(Preferences)存储详解
原创
11128 浏览 322 点赞 0 收藏
鸿蒙首选项(Preferences)存储详解
1. 存储核心特性
| 特性 | 说明 |
|---|---|
| 存储形式 | 轻量级 键值对(Key-Value) 存储 |
| 支持数据类型 | string、number、boolean、Array、Object 等基础类型 |
| 存储位置 | 应用沙箱内 //data/app/el2/100/base/<包名>/database/<pref_name>.pref |
| 访问权限 | 应用私有(其他应用无法访问) |
| 性能优势 | 毫秒级读写延迟,适合高频访问的轻量数据 |
2. ArkTS 操作示例
// 导入首选项模块
import preferences from '@ohos.data.preferences';
@Entry
@Component
struct SettingsPage {
// 创建首选项实例
private pref: preferences.Preferences = await preferences.getPreferences(this.context, 'userSettings');
// 存储数据
async saveSettings() {
try {
// 存储键值对
await this.pref.put('theme', 'dark'); // 字符串
await this.pref.put('notifications', true); // 布尔值
await this.pref.put('fontSize', 16); // 数值
await this.pref.put('tags', ['urgent', 'work']); // 数组
// 提交更改(异步刷盘)
await this.pref.flush();
console.info('首选项保存成功');
} catch (err) {
console.error(`保存失败: ${err.code}, ${err.message}`);
}
}
// 读取数据
async loadSettings() {
try {
// 获取值(带默认值)
const theme: string = await this.pref.get('theme', 'light');
const notify: boolean = await this.pref.get('notifications', false);
const size: number = await this.pref.get('fontSize', 14);
const tags: string[] = await this.pref.get('tags', ['default']);
// 更新UI状态
AppStorage.setOrCreate('currentTheme', theme);
AppStorage.setOrCreate('fontSize', size);
} catch (err) {
console.error(`读取失败: ${err.code}, ${err.message}`);
}
}
// 删除数据
async clearToken() {
await this.pref.delete('authToken');
await this.pref.flush();
}
// 生命周期:页面显示时加载
onPageShow() {
this.loadSettings();
}
build() {
Column() {
Toggle({ type: ToggleType.Checkbox, isOn: $rawApp('notifications') })
.onChange(async (checked: boolean) => {
await this.pref.put('notifications', checked);
})
}
}
}3. 最佳实践
- 命名规范// 使用业务语义化前缀 const pref = await preferences.getPreferences(this.context, 'payment_settings');
- 敏感数据加密import { BusinessError } from '@ohos.base'; import cryptoFramework from '@ohos.security.cryptoFramework'; async storeSensitiveData(key: string, value: string) { const cipher = await cryptoFramework.createCipher('AES256|ECB|PKCS7'); // ... 加密流程 await this.pref.put(key, encryptedValue); }
- 数据监听(ArkUI联动)// 注册数据变更监听 this.pref.on('change', (key: string) => { if (key === 'theme') { // 自动更新UI AppStorage.set('currentTheme', this.pref.getSync('theme')); } });
4. 文件存储位置
应用沙箱路径示例:
/data/app/el2/100/base/com.example.myapp/database/userSettings.pref
文件结构:
- Header (元信息)
- Key1: Value1 (二进制编码)
- Key2: Value2
- ...5. 适用场景
| 场景 | 示例数据 | 优势 |
|---|---|---|
| 用户个性化设置 | 主题色、字体大小、通知开关 | 高频访问,低延迟 |
| 应用状态保存 | 登录Token、上次访问页面 | 进程关闭后自动持久化 |
| 轻量缓存 | 列表排序规则、临时筛选条件 | 替代AsyncStorage更高效 |
| 设备特性记录 | 屏幕亮度偏好、音量设置 | 跨会话保持一致性 |
关键限制:单文件大小限制 1MB(超大数据需用RDB关系型数据库)键名长度上限 80字节,字符串值上限 8192字节数组/对象会被序列化为字符串存储(需自行管理序列化)
6. 与AppStorage联动
// 将首选项绑定到ArkUI全局状态
AppStorage.linkPreference(this.context, 'notifications', 'userSettings', 'notifications');
// 组件内直接使用
@StorageLink('notifications') notifyEnabled: boolean = false;
build() {
Toggle({ isOn: this.notifyEnabled })
.onChange((val) => {
// 自动更新首选项
this.notifyEnabled = val;
})
}对比其他存储方案
| 存储方式 | 首选项(Preferences) | 关系型数据库(RDB) | 文件存储 |
|---|---|---|---|
| 数据模型 | 键值对 | 表结构 | 任意文件 |
| 查询效率 | O(1) 键访问 | O(log n) 索引查询 | 需全文件扫描 |
| 适用场景 | 配置/状态 | 结构化数据 | 大文件/二进制流 |
| 鸿蒙推荐场景 | ★★★★☆ | ★★★★☆ | ★★☆☆☆ |
©本站发布的所有内容,包括但不限于文字、图片、音频、视频、图表、标志、标识、广告、商标、商号、域名、软件、程序等,除特别标明外,均来源于网络或用户投稿,版权归原作者或原出处所有。我们致力于保护原作者版权,若涉及版权问题,请及时联系我们进行处理。
分类
HarmonyOS
标签
HarmonyOS
首选项
K老师
暂无评论数据
发布
相关推荐
以技术破局,以生态赋能|IAM亮相鸿蒙智选峰会,X5Ultra引领智家健康新趋势
云上修代码
2171
0鸿蒙智选720智能空气净化器铂境Pro Max亮相鸿蒙峰会 以硬核科技定义智慧健康新标杆
快乐编译者
1168
0华为全场景亮相AWE 2026:华为鸿蒙智家 智慧全生态重塑未来家
2030
0华为鸿蒙智家技术升级,多款新品亮相AWE2026
老李的控制台
1202
0微信鸿蒙版 App 扫码登录手表端要求公布,手机系统需升级至 HarmonyOS 6.0.0.130 及以上版本
1361
0K老师
大家好我是K老师,这是我的个人介绍:鸿蒙先锋,鸿蒙开发者达人,鸿蒙应用架构师,HDG组织者,可0-1开发纯血鸿蒙应用,可0-1开发前端加鸿蒙混合应用,可0-1开发PC端鸿蒙应用。
118
帖子
0
提问
1412
粉丝
最新发布
[HarmonyOS][K老师]鸿蒙中主线程与子线程通信机制详解,Emitter,Worker,EventHandler和EventRunner。
2026-01-28 11:31:47 发布[HarmonyOS][K老师]鸿蒙大文件上传方案。
2026-01-28 10:30:53 发布热门推荐