鸿蒙Next中preferences如何进行数据持久化封装

在鸿蒙Next中,如何使用Preferences进行数据持久化封装?具体实现步骤和最佳实践是什么?是否需要额外配置或依赖?希望能提供详细的代码示例和注意事项。

2 回复

鸿蒙Next的Preferences数据持久化封装,简单三步走:

  1. 创建Preferences实例
  2. put数据(支持多种类型)
  3. flush保存到文件

代码示例:

Preferences prefs = PreferencesHelper.getPreferences(context);
prefs.putString("key", "value").flush();

记住:flush是灵魂,不调用就白忙活了!

更多关于鸿蒙Next中preferences如何进行数据持久化封装的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在鸿蒙Next中,使用preferences进行数据持久化时,推荐进行封装以提高代码复用性和可维护性。以下是封装示例:

1. 创建Preferences工具类

import preferences from '@ohos.data.preferences';

export class PreferencesUtil {
  private static instance: PreferencesUtil;
  private preferencesMap: Map<string, preferences.Preferences> = new Map();

  static getInstance(): PreferencesUtil {
    if (!PreferencesUtil.instance) {
      PreferencesUtil.instance = new PreferencesUtil();
    }
    return PreferencesUtil.instance;
  }

  // 初始化Preferences
  async loadPreference(context: Context, name: string): Promise<void> {
    try {
      const pref = await preferences.getPreferences(context, name);
      this.preferencesMap.set(name, pref);
    } catch (err) {
      console.error(`Failed to load preferences. Code: ${err.code}, message: ${err.message}`);
    }
  }

  // 存储数据
  async putPreferenceValue(name: string, key: string, value: preferences.ValueType): Promise<void> {
    const pref = this.preferencesMap.get(name);
    if (!pref) {
      console.error('Preferences not initialized');
      return;
    }
    try {
      await pref.put(key, value);
      await pref.flush();
    } catch (err) {
      console.error(`Failed to put value. Code: ${err.code}, message: ${err.message}`);
    }
  }

  // 读取数据
  async getPreferenceValue(name: string, key: string, defaultValue: preferences.ValueType): Promise<preferences.ValueType> {
    const pref = this.preferencesMap.get(name);
    if (!pref) {
      console.error('Preferences not initialized');
      return defaultValue;
    }
    try {
      return await pref.get(key, defaultValue);
    } catch (err) {
      console.error(`Failed to get value. Code: ${err.code}, message: ${err.message}`);
      return defaultValue;
    }
  }

  // 删除数据
  async deletePreferenceValue(name: string, key: string): Promise<void> {
    const pref = this.preferencesMap.get(name);
    if (!pref) {
      console.error('Preferences not initialized');
      return;
    }
    try {
      await pref.delete(key);
      await pref.flush();
    } catch (err) {
      console.error(`Failed to delete value. Code: ${err.code}, message: ${err.message}`);
    }
  }
}

2. 在EntryAbility中初始化

import { PreferencesUtil } from './PreferencesUtil';

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    PreferencesUtil.getInstance().loadPreference(this.context, 'myPrefs');
  }
}

3. 在页面中使用

const preferencesUtil = PreferencesUtil.getInstance();

// 存储数据
await preferencesUtil.putPreferenceValue('myPrefs', 'username', 'Alice');

// 读取数据
const username = await preferencesUtil.getPreferenceValue('myPrefs', 'username', 'default');

// 删除数据
await preferencesUtil.deletePreferenceValue('myPrefs', 'username');

封装优势:

  • 单例模式确保全局唯一实例
  • 统一错误处理
  • 支持多个Preferences文件管理
  • 简化调用接口

注意事项:

  1. 需要在Ability的onCreate中初始化
  2. 所有操作都是异步的,需要使用await
  3. 存储复杂对象时需要先序列化

这种封装方式可以有效管理应用中的轻量级数据存储,提高代码的可维护性。

回到顶部