HarmonyOS鸿蒙 Preference 数据存储:简单实用的本地存储方案

鸿蒙 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;
    }
  }
}

工具类说明:

  1. 单例模式:确保整个应用使用同一个 Preference 实例
  2. 同步操作 :使用 Sync 后缀的方法进行同步操作,简单直观
  3. 错误处理:捕获异常并返回默认值,保证程序稳定性

三、在页面中使用 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 的自动绑定

四、运行效果

  1. 首次运行:点击"读取数据"显示"默认值"
  2. 保存数据后:点击"读取数据"显示"保存的数据"
  3. 重启应用:数据仍然存在,不会丢失

五、Preference 的常见使用场景

场景 数据示例 说明
用户设置 主题颜色、字体大小 保存用户的个性化设置
应用状态 首次启动标志、登录状态 记录应用运行状态
缓存数据 搜索历史、临时配置 临时存储,提升用户体验

六、注意事项

  1. 数据类型限制:Preference 主要存储简单数据类型,复杂对象需要序列化
  2. 存储容量:不适合存储大量数据,建议小于 1MB
  3. 性能考虑:频繁读写可能影响性能,建议批量操作

七、扩展功能(可选)

如果想支持更多数据类型,可以扩展工具类:

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 存储功能!

相关推荐
不爱吃糖的程序媛2 小时前
Flutter-OH 插件适配 HarmonyOS 实战:以屏幕方向控制为例
flutter·华为·harmonyos
松叶似针2 小时前
Flutter三方库适配OpenHarmony【doc_text】— 文件格式路由:.doc 与 .docx 的分流策略
flutter·harmonyos
阿林来了2 小时前
Flutter三方库适配OpenHarmony【flutter_web_auth】— FlutterPlugin 与 AbilityAware 双接口实现
flutter·harmonyos
星空22232 小时前
鸿蒙跨平台实战day49:React Native在OpenHarmony上的Font字体降级策略详解
react native·华为·harmonyos
松叶似针2 小时前
Flutter三方库适配OpenHarmony【doc_text】— FlutterPlugin 接口实现与 MethodChannel 注册
flutter·harmonyos
星空22232 小时前
鸿蒙跨平台实战day48:React Native在OpenHarmony上的Font字体加载管理详解
react native·华为·harmonyos
星空22232 小时前
鸿蒙跨平台实战day46:React Native在OpenHarmony上的AccessibilityInfo无障碍检测
react native·react.js·harmonyos
●VON2 小时前
HarmonyOS应用开发实战(基础篇)Day12 -《打造专业级底部导航栏》
学习·华为·harmonyos·von
特立独行的猫a2 小时前
跨平台开发实战:uni-app x 鸿蒙HarmonyOS网络模块封装与轮播图实现
android·网络·uni-app·harmonyos·轮播图·uni-app-x