鸿蒙 Preference 数据存储:简单实用的本地存储方案
前言
在鸿蒙(HarmonyOS)应用开发中,经常需要保存一些简单的配置信息、用户偏好设置或临时数据。Preference 就是鸿蒙提供的一种轻量级键值对存储方案,它类似于 Android 的 SharedPreferences,操作简单,性能高效。
今天,我将通过一个简单的 Demo 来展示如何在鸿蒙应用中使用 Preference 进行数据存储。
一、什么是 Preference?
Preference 是鸿蒙 ArkData 模块提供的一种本地数据存储方式,它有以下特点:
- 轻量级:适用于存储小量数据
- 键值对存储:类似 Map 结构,简单易用
- 线程安全:可以在多线程环境下使用
- 数据类型丰富:支持字符串、数字、布尔值等
二、封装 Preference 工具类
为了简化使用,我们先封装一个工具类:
typescript
// utils/PreferenceUtil.ets
import { preferences } from '@kit.ArkData';
export class PreferenceUtil {
// 创建 Preference 实例
private static myPref: preferences.Preferences = preferences.getPreferencesSync(
AppStorage.get('Context'),
{ name: 'myPref' }
);
// 保存数据
static save(key: string, value: string): boolean {
try {
PreferenceUtil.myPref.putSync(key, value);
PreferenceUtil.myPref.flushSync();
return true;
} catch (error) {
console.error('Save error:', error);
return false;
}
}
// 读取数据
static load(key: string, defaultValue: string): preferences.ValueType {
try {
return PreferenceUtil.myPref.getSync(key, defaultValue);
} catch (error) {
console.error('Load error:', error);
return defaultValue;
}
}
}
工具类说明:
- 单例模式:确保整个应用使用同一个 Preference 实例
- 同步操作 :使用
Sync后缀的方法进行同步操作,简单直观 - 错误处理:捕获异常并返回默认值,保证程序稳定性
三、在页面中使用 Preference
下面是一个完整的页面示例,演示如何保存和读取数据:
typescript
// pages/PreferencePage.ets
import { PreferenceUtil } from './utils/PreferenceUtil';
@Entry
@Component
struct PreferencePage {
@State message: string = '点击按钮加载数据';
// 保存数据
private saveData() {
const success = PreferenceUtil.save('key', 'HarmonyOS Preference Demo');
this.message = success ? '数据保存成功!' : '保存失败!';
}
// 读取数据
private loadData() {
const value = PreferenceUtil.load('key', '默认值');
this.message = `读取的值:${value}`;
}
build() {
RelativeContainer() {
// 显示消息的文本组件
Text(this.message)
.id('displayText')
.fontSize(20)
.fontWeight(FontWeight.Bold)
.alignRules({
top: { anchor: '__container__', align: VerticalAlign.Top },
middle: { anchor: '__container__', align: HorizontalAlign.Center }
})
// 保存按钮
Button('保存数据')
.id('saveButton')
.width(150)
.height(40)
.alignRules({
top: { anchor: 'displayText', align: VerticalAlign.Bottom },
middle: { anchor: '__container__', align: HorizontalAlign.Center },
bottom: { anchor: 'loadButton', align: VerticalAlign.Top }
})
.onClick(() => this.saveData())
// 读取按钮
Button('读取数据')
.id('loadButton')
.width(150)
.height(40)
.alignRules({
center: { anchor: '__container__', align: VerticalAlign.Center },
middle: { anchor: '__container__', align: HorizontalAlign.Center }
})
.onClick(() => this.loadData())
}
.height('100%')
.width('100%')
.padding(20)
}
}
页面功能说明:
- 点击"保存数据"按钮:将字符串保存到本地
- 点击"读取数据"按钮:从本地读取并显示数据
- 使用
@State装饰器:实现数据与 UI 的自动绑定
四、运行效果
- 首次运行:点击"读取数据"显示"默认值"
- 保存数据后:点击"读取数据"显示"保存的数据"
- 重启应用:数据仍然存在,不会丢失
五、Preference 的常见使用场景
| 场景 | 数据示例 | 说明 |
|---|---|---|
| 用户设置 | 主题颜色、字体大小 | 保存用户的个性化设置 |
| 应用状态 | 首次启动标志、登录状态 | 记录应用运行状态 |
| 缓存数据 | 搜索历史、临时配置 | 临时存储,提升用户体验 |
六、注意事项
- 数据类型限制:Preference 主要存储简单数据类型,复杂对象需要序列化
- 存储容量:不适合存储大量数据,建议小于 1MB
- 性能考虑:频繁读写可能影响性能,建议批量操作
七、扩展功能(可选)
如果想支持更多数据类型,可以扩展工具类:
typescript
// 扩展工具类
static saveBoolean(key: string, value: boolean): boolean {
return this.save(key, value.toString());
}
static loadBoolean(key: string, defaultValue: boolean): boolean {
const value = this.load(key, defaultValue.toString());
return value === 'true';
}
// 保存对象(需要 JSON 序列化)
static saveObject(key: string, obj: Object): boolean {
return this.save(key, JSON.stringify(obj));
}
static loadObject(key: string, defaultValue: Object): Object {
const value = this.load(key, JSON.stringify(defaultValue));
return JSON.parse(value as string);
}
总结
Preference 是鸿蒙应用开发中最简单的本地存储方案,适合存储小量的配置信息和用户偏好。通过封装工具类,我们可以更方便地在应用中使用它。
记住几个关键点:
- 适合存储简单数据
- 操作简单,性能良好
- 注意异常处理和默认值设置
希望这个简单的 Demo 能帮助你快速上手鸿蒙的 Preference 存储功能!