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

相关推荐
国医中兴3 小时前
Flutter 三方库 dson 的鸿蒙化适配指南 - 极简的序列化魔法、在鸿蒙端实现反射式 JSON 映射实战
flutter·harmonyos·鸿蒙·openharmony
池央4 小时前
在鸿蒙上跑 AI Agent:JiuwenClaw-on-OpenHarmony 完整实战
人工智能·华为·harmonyos
互联网散修5 小时前
零基础鸿蒙应用开发第五节:基础数据类型与对象类型转换
华为·harmonyos·鸿蒙应用开发入门教程
弓.长.5 小时前
ReactNative for OpenHarmony项目鸿蒙化三方库:react-native-fast-image — 高性能图片加载组件
react native·react.js·harmonyos
互联网散修5 小时前
零基础鸿蒙应用开发第六节:复杂数据类型入门 —— 数组、元组与枚举
华为·log4j·harmonyos
国医中兴6 小时前
Flutter 三方库 cloudflare_r2_uploader 的鸿蒙化适配指南 - 云端存储的疾速通道、在鸿蒙端实现 R2 分段上传实战
flutter·harmonyos·鸿蒙·openharmony·cloudflare_r2_uploader
盐焗西兰花6 小时前
鸿蒙学习实战之路-Share Kit系列(13/17)-配置目标应用名单(企业应用)
学习·华为·harmonyos
Easonmax6 小时前
ReactNative for OpenHarmony项目鸿蒙化三方库:react-native-image-picker — 图片选择器
react native·react.js·harmonyos
C雨后彩虹6 小时前
最小矩阵宽度
java·数据结构·算法·华为·面试
luoganttcc6 小时前
华为 昇腾 架构怎么 解决这个 NCCL 通信问题
华为·架构