[HarmonyOS][K老师]鸿蒙首选项(Preferences)存储详解 原创
头像 K老师 2026-01-08 14:42:53    发布
11128 浏览 322 点赞 0 收藏

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

1. 存储核心特性

 特性说明
 存储形式轻量级 键值对(Key-Value) 存储
 支持数据类型stringnumberbooleanArrayObject 等基础类型
 存储位置应用沙箱内 //data/app/el2/100/base/<包名>/database/<pref_name>.pref
 访问权限应用私有(其他应用无法访问)
 性能优势毫秒级读写延迟,适合高频访问的轻量数据

2. ArkTS 操作示例

// 导入首选项模块
import preferences from '@ohos.data.preferences';

@Entry
@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. 最佳实践

  1. 命名规范// 使用业务语义化前缀 const pref = await preferences.getPreferences(this.context, 'payment_settings');
  2. 敏感数据加密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); }
  3. 数据监听(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

暂无评论数据

发布

头像

K老师

大家好我是K老师,这是我的个人介绍:鸿蒙先锋,鸿蒙开发者达人,鸿蒙应用架构师,HDG组织者,可0-1开发纯血鸿蒙应用,可0-1开发前端加鸿蒙混合应用,可0-1开发PC端鸿蒙应用。

118

帖子

0

提问

1412

粉丝

关注
热门推荐
地址:北京市朝阳区北三环东路三元桥曙光西里甲1号第三置业A座1508室 商务内容合作QQ:2291221 电话:13391790444或(010)62178877
版权所有:电脑商情信息服务集团 北京赢邦策略咨询有限责任公司
声明:本媒体部分图片、文章来源于网络,版权归原作者所有,我司致力于保护作者版权,如有侵权,请与我司联系删除
京ICP备:2022009079号-2
京公网安备:11010502051901号
ICP证:京B2-20230255