HarmonyOS 鸿蒙Next中用户首选项(Preferences)使用

HarmonyOS 鸿蒙Next中用户首选项(Preferences)使用 在HarmonyOS应用开发中,经常需要实现数据存储功能功能,包括:

  1. 登录数据
  2. 缓存数据

等等

如何利用HarmonyOS提供的Preferences服务实现这些数据的存储?

3 回复

作为鸿蒙轻量数据持久化的首选,Preferences 以文本形式存储键值对,应用启动时全量加载到内存,读写效率极高,但不适合存储大量数据(内存占用会随数据量增长而增大)。​

❶ 适用场景快速判断​

适用存储场景(如下图中 1、2、3、5、6、10、11) 针对于小白开发者来说可以推敲下为什么这些场景要用Preferences来存储而不是api接口直接获取展示🤔。

图片

快速判断标准:​

单条数据(原始类型 / 单个对象)→ 直接用 Preferences​

多条对象 / 复杂结构数据 → 切换关系型数据库

❷ 基础开发 3 步走(快速上手)​

2.1. 导入核心模块​

import { preferences } from '@kit.ArkData';

2.2. 获取 Preferences 实例​

通过上下文创建实例,name为存储到磁盘的文件名:​

// 简洁写法
const dataPreferences = preferences.getPreferencesSync(this.context, { name: 'myStore' });

2.33. 核心 API 使用(存 / 读 / 删)​

存储​ putSync(键, 值) + flush()​ putSync写入内存,flush()同步到磁盘(实现持久化)​

读取 ​getSync(键, 默认值)​  从内存中读取,应用重启后会从磁盘加载到内存​

删除 ​deleteSync(键)​  从内存中删除,需配合flush()同步到磁盘​

​⚠️ 关键提醒:

Preferences 数据持久化功能必须在模拟器或真机上运行,预览模式无法生效!​

Preferences 数据持久化功能必须在模拟器或真机上运行,预览模式无法生效!​

Preferences 数据持久化功能必须在模拟器或真机上运行,预览模式无法生效!​

磁盘文件路径:/data/app/el2/100/base/应用唯一标识/haps/entry/preferences/文件名(可通过 Device File Browser 查看)​

❸ 实战封装:PreferencesUtil 工具类

3.1 工具类代码(utils/PreferencesUtil.ets)

工作推荐api改成异步 这里为了减少代码用的同步 

import { common } from '@kit.AbilityKit';
import { preferences } from '@kit.ArkData';
 
class PreferencesUtil {
  // 私有实例,避免外部修改
  private dataPreferences: preferences.Preferences | null = null;
 
  /**
   * 初始化 Preferences(在entryability中调用)
   * @param context 上下文环境
   */
  loadPreferences(context: common.UIAbilityContext) {
    if (!this.dataPreferences) {
      this.dataPreferences = preferences.getPreferencesSync(context, { name: 'myStore' });
    }
  }
 
  /**
   * 存储数据到内存(需配合flush同步到磁盘)
   * @param key 键
   * @param value 值(支持原始类型/单个对象)
   */
  put(key: string, value: preferences.ValueType) {
    this.dataPreferences?.putSync(key, value);
  }
 
  /**
   * 从内存读取数据
   * @param key 键
   * @param defaultValue 默认值
   * @returns 存储的值或默认值
   */
  get(key: string, defaultValue: preferences.ValueType) {
    return this.dataPreferences?.getSync(key, defaultValue) ?? defaultValue;
  }
 
  /**
   * 存储并同步到磁盘(推荐优先使用)
   * @param key 键
   * @param value 值
   */
  flush(key: string, value: preferences.ValueType) {
    this.put(key, value);
    this.dataPreferences?.flushSync(); // 同步到磁盘,确保持久化
  }
}
 
// 导出单例对象(全局唯一)
export const preferencesUtil = new PreferencesUtil();

3.2 初始化工具类(entryability 中)

import { preferencesUtil } from '../utils/PreferencesUtil';
 
export default class EntryAbility extends UIAbility {
  onWindowStageCreate(windowStage) {
    // 初始化 Preferences(仅需调用一次)
    preferencesUtil.loadPreferences(this.context);
    // ...其他逻辑
  }
}

3.3 使用

import { preferencesUtil } from '../utils/PreferencesUtil';
 
@Entry
@Component
struct Index {
  build() {
    Column({ space: 10 })
      .width('100%')
      .height('100%')
      .justifyContent(FlexAlign.Center) {
        Button('存储用户信息').onClick(() => {
          preferencesUtil.flush('userName', '神龙教主');
          preferencesUtil.flush('isLogin', true);
        });
 
        Button('读取用户信息').onClick(() => {
          const userName = preferencesUtil.get('userName', '匿名用户');
          const isLogin = preferencesUtil.get('isLogin', false);
          console.log(`用户名:${userName},登录状态:${isLogin}`);
        });
      }
}

更多关于HarmonyOS 鸿蒙Next中用户首选项(Preferences)使用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


鸿蒙Next中用户首选项(Preferences)是轻量级数据存储方案,用于保存键值对数据。通过@ohos.data.preferences模块实现,支持持久化存储应用配置信息。主要接口包括getPreferences获取实例、put存储数据、get读取数据、flush提交更改、delete删除数据。数据以文件形式存储于应用沙箱内,确保安全隔离。

在HarmonyOS Next中,用户首选项(Preferences)是轻量级键值存储方案,适用于保存登录状态、应用配置等简单数据。以下是核心使用方法:

1. 获取Preferences实例 使用preferences.getPreferences()获取指定文件名的实例,数据以文件形式存储于应用沙箱内。

import { preferences } from '@kit.ArkData';

let context = getContext(this) as common.UIAbilityContext;
let pref = await preferences.getPreferences(context, 'myAppPrefs');

2. 数据写入 通过put()方法存储键值对,支持string、number、boolean等基础类型,最后需调用flush()提交。

await pref.put('isLoggedIn', true);
await pref.put('username', 'user123');
await pref.put('lastLoginTime', Date.now());
await pref.flush(); // 确保数据持久化

3. 数据读取 使用get()方法读取数据,可指定默认值。

let isLoggedIn: boolean = await pref.get('isLoggedIn', false);
let username: string = await pref.get('username', '');
let cacheTime: number = await pref.get('cacheTimestamp', 0);

4. 数据删除与清理

  • 删除指定键:delete()
  • 清空所有数据:clear()
  • 删除物理文件:preferences.deletePreferences()

5. 监听数据变更 可注册回调监听特定键的变化:

pref.on('change', (key: string) => {
  if (key === 'isLoggedIn') {
    // 处理登录状态变更
  }
});

注意事项:

  • Preferences适用于少量结构化数据(建议不超过1万条)
  • 存储敏感信息建议使用安全加密模块
  • 频繁操作建议批量处理,避免多次flush
  • 进程间数据共享需使用分布式Preferences

对于登录数据,建议存储token和基础用户信息;缓存数据可存储时间戳和关键标识。实际开发中应根据数据量级和安全性要求,结合分布式数据管理或关系型数据库进行方案选型。

回到顶部