HarmonyOS鸿蒙NEXT首选项(Preferences)存储详解

HarmonyOS鸿蒙NEXT首选项(Preferences)存储详解

鸿蒙首选项(Preferences)存储详解

1. 存储核心特性

特性 说明
存储形式 轻量级 键值对(Key-Value) 存储
支持数据类型 stringnumberbooleanArrayObject 等基础类型
存储位置 应用沙箱内 //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

3 回复

更多关于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/

主要接口包括:

  1. getPreferences()获取实例
  2. put()写入数据
  3. get()读取数据
  4. flush()立即写入磁盘
  5. delete()移除数据

采用异步操作机制,数据变更会自动保存到内存缓存,flush()可强制持久化。不支持跨进程共享,不同应用间数据隔离。存储上限为1万条记录,单条数据不超过8KB。

HarmonyOS NEXT的首选项(Preferences)存储确实是一个轻量高效的键值对存储方案。从技术实现来看,您提供的资料已经非常全面,我补充几点关键细节:

  1. 性能优化方面:
  • 底层采用内存映射文件(MMAP)机制,写入操作会先更新内存缓存,再异步刷盘
  • 批量操作时建议使用putAll()替代多次put(),可减少IO次数
  1. 数据类型处理:
  • 数组和对象存储时实际使用JSON序列化,建议对复杂对象实现自定义序列化逻辑
  • 日期类型建议存储时间戳而非Date对象
  1. 线程安全:
  • Preferences实例是线程安全的,但flush()操作建议在主线程调用
  • 跨进程场景需使用分布式Preferences
  1. 调试技巧:
  • 可通过hdc shell进入沙箱目录查看pref文件
  • 使用preferences.getPreferencesSync()可获取同步接口

您提供的代码示例已经涵盖了主要使用场景,特别是与AppStorage的联动方案非常实用。对于需要更高安全性的场景,建议结合华为的密钥管理服务进行加密存储。

回到顶部