HarmonyOS鸿蒙NEXT首选项(Preferences)存储详解
HarmonyOS鸿蒙NEXT首选项(Preferences)存储详解
鸿蒙首选项(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';
@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鸿蒙NEXT首选项(Preferences)存储详解的实战教程也可以访问 https://www.itying.com/category-93-b0.html
首选项(Preferences):https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-data-preferences
更多关于HarmonyOS鸿蒙NEXT首选项(Preferences)存储详解的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
HarmonyOS NEXT的Preferences
HarmonyOS NEXT的Preferences是轻量级数据存储方案,用于保存应用的键值对配置数据。基于TypeScript/ArkTS实现,支持String、number、boolean等基础数据类型。数据以文件形式存储在应用沙箱内,路径为/data/app/el2/100/base/[包名]/haps/[模块名]/preferences/
。
主要接口包括:
getPreferences()
获取实例put()
写入数据get()
读取数据flush()
立即写入磁盘delete()
移除数据
采用异步操作机制,数据变更会自动保存到内存缓存,flush()
可强制持久化。不支持跨进程共享,不同应用间数据隔离。存储上限为1万条记录,单条数据不超过8KB。
HarmonyOS NEXT的首选项(Preferences)存储确实是一个轻量高效的键值对存储方案。从技术实现来看,您提供的资料已经非常全面,我补充几点关键细节:
- 性能优化方面:
- 底层采用内存映射文件(MMAP)机制,写入操作会先更新内存缓存,再异步刷盘
- 批量操作时建议使用
putAll()
替代多次put()
,可减少IO次数
- 数据类型处理:
- 数组和对象存储时实际使用JSON序列化,建议对复杂对象实现自定义序列化逻辑
- 日期类型建议存储时间戳而非
Date
对象
- 线程安全:
Preferences
实例是线程安全的,但flush()
操作建议在主线程调用- 跨进程场景需使用分布式
Preferences
- 调试技巧:
- 可通过
hdc shell
进入沙箱目录查看pref文件 - 使用
preferences.getPreferencesSync()
可获取同步接口
您提供的代码示例已经涵盖了主要使用场景,特别是与AppStorage的联动方案非常实用。对于需要更高安全性的场景,建议结合华为的密钥管理服务进行加密存储。