鸿蒙NEXT开发Preferences工具类(ArkTs)

import { AppUtil } from './AppUtil';
import dataPreferences from '@ohos.data.preferences';
export const DEFAULT_PREFERENCE_NAME: string = "SP_HARMONY_UTILS_PREFERENCES"; // Preferences实例的名称。

/**
 * Preferences工具类
 * @author CSDN-鸿蒙布道师
 * @since 2025/04/09
 */
export class PreferencesUtil {

  private static defaultPreferenceName: string = DEFAULT_PREFERENCE_NAME;
  private static preferences: dataPreferences.Preferences;

  /**
   * 初始化Preferences实例(非必要不要初始化该方法)。
   * @param preferenceName Preferences实例的名称。
   */
  static init(preferenceName: string) {
    if (!PreferencesUtil.preferences || preferenceName !== PreferencesUtil.defaultPreferenceName) {
      PreferencesUtil.defaultPreferenceName = preferenceName;
      PreferencesUtil.preferences = dataPreferences.getPreferencesSync(AppUtil.getContext(), { name: preferenceName });
    }
  }

  /**
   * 获取Preferences实例。
   * @param preferenceName 实例名称。
   * @returns Preferences实例。
   */
  private static async getPreferences(preferenceName: string = PreferencesUtil.defaultPreferenceName): Promise {
    if (preferenceName !== PreferencesUtil.defaultPreferenceName || !PreferencesUtil.preferences) {
      PreferencesUtil.preferences = await dataPreferences.getPreferences(AppUtil.getContext(), preferenceName);
    }
    return PreferencesUtil.preferences;
  }

  /**
   * 同步获取Preferences实例。
   * @param preferenceName 实例名称。
   * @returns Preferences实例。
   */
  private static getPreferencesSync(preferenceName: string = PreferencesUtil.defaultPreferenceName): dataPreferences.Preferences {
    if (preferenceName !== PreferencesUtil.defaultPreferenceName || !PreferencesUtil.preferences) {
      PreferencesUtil.preferences = dataPreferences.getPreferencesSync(AppUtil.getContext(), { name: preferenceName });
    }
    return PreferencesUtil.preferences;
  }

  /**
   * 将数据缓存到指定的Preferences实例中。
   * @param key 键。
   * @param value 值。
   * @param preferenceName 实例名称。
   */
  static putSync(key: string, value: dataPreferences.ValueType, preferenceName: string = PreferencesUtil.defaultPreferenceName) {
    PreferencesUtil.performSyncAction(preferenceName, (preferences) => {
      preferences.putSync(key, value);
      preferences.flush(); // 确保数据永久序列化到本地
    });
  }

  static async put(key: string, value: dataPreferences.ValueType, preferenceName: string = PreferencesUtil.defaultPreferenceName) {
    await PreferencesUtil.performAsyncAction(preferenceName, async (preferences) => {
      await preferences.put(key, value);
      await preferences.flush(); // 确保数据永久序列化到本地
    });
  }

  /**
   * 获取缓存值(同步)。
   * @param key 键。
   * @param defValue 默认值。
   * @param preferenceName 实例名称。
   * @returns 缓存值。
   */
  static getSync(key: string, defValue: T, preferenceName: string = PreferencesUtil.defaultPreferenceName): T {
    return PreferencesUtil.performSyncAction(preferenceName, (preferences) => preferences.getSync(key, defValue)) as T;
  }

  /**
   * 获取缓存值(异步)。
   * @param key 键。
   * @param defValue 默认值。
   * @param preferenceName 实例名称。
   * @returns 缓存值。
   */
  static async get(key: string, defValue: T, preferenceName: string = PreferencesUtil.defaultPreferenceName): Promise {
    return PreferencesUtil.performAsyncAction(preferenceName, async (preferences) => await preferences.get(key, defValue)) as Promise;
  }

  /**
   * 删除指定键的缓存值。
   * @param key 键。
   * @param preferenceName 实例名称。
   */
  static deleteSync(key: string, preferenceName: string = PreferencesUtil.defaultPreferenceName) {
    PreferencesUtil.performSyncAction(preferenceName, (preferences) => {
      preferences.deleteSync(key);
      preferences.flush(); // 确保数据永久序列化到本地
    });
  }

  static async delete(key: string, preferenceName: string = PreferencesUtil.defaultPreferenceName) {
    await PreferencesUtil.performAsyncAction(preferenceName, async (preferences) => {
      await preferences.delete(key);
      await preferences.flush(); // 确保数据永久序列化到本地
    });
  }

  /**
   * 清空所有缓存数据。
   * @param preferenceName 实例名称。
   */
  static clearSync(preferenceName: string = PreferencesUtil.defaultPreferenceName) {
    PreferencesUtil.performSyncAction(preferenceName, (preferences) => {
      preferences.clearSync();
      preferences.flush(); // 确保数据永久序列化到本地
    });
  }

  static async clear(preferenceName: string = PreferencesUtil.defaultPreferenceName) {
    await PreferencesUtil.performAsyncAction(preferenceName, async (preferences) => {
      await preferences.clear();
      await preferences.flush(); // 确保数据永久序列化到本地
    });
  }

  /**
   * 检查是否包含指定键。
   * @param key 键。
   * @param preferenceName 实例名称。
   * @returns 是否包含。
   */
  static hasSync(key: string, preferenceName: string = PreferencesUtil.defaultPreferenceName): boolean {
    return PreferencesUtil.performSyncAction(preferenceName, (preferences) => preferences.hasSync(key));
  }

  static async has(key: string, preferenceName: string = PreferencesUtil.defaultPreferenceName): Promise {
    return PreferencesUtil.performAsyncAction(preferenceName, async (preferences) => await preferences.has(key));
  }

  /**
   * 订阅数据变更。
   * @param callback 回调函数。
   * @param preferenceName 实例名称。
   */
  static onChange(callback: Callback, preferenceName: string = PreferencesUtil.defaultPreferenceName) {
    PreferencesUtil.performSyncAction(preferenceName, (preferences) => preferences.on('change', callback));
  }

  static offChange(callback?: Callback, preferenceName: string = PreferencesUtil.defaultPreferenceName) {
    PreferencesUtil.performSyncAction(preferenceName, (preferences) => {
      if (callback) {
        preferences.off('change', callback);
      } else {
        preferences.off('change');
      }
    });
  }

  /**
   * 辅助方法:执行同步操作。
   * @param preferenceName 实例名称。
   * @param action 执行的操作。
   * @returns 操作的结果。
   */
  private static performSyncAction(preferenceName: string, action: (preferences: dataPreferences.Preferences) => T): T {
    const preferences = PreferencesUtil.getPreferencesSync(preferenceName);
    return action(preferences); // 确保返回操作的结果
  }

  /**
   * 辅助方法:执行异步操作。
   * @param preferenceName 实例名称。
   * @param action 执行的操作。
   */
  private static async performAsyncAction(preferenceName: string, action: (preferences: dataPreferences.Preferences) => Promise): Promise {
    const preferences = await PreferencesUtil.getPreferences(preferenceName);
    return action(preferences);
  }
}

代码如下:
import { AppUtil } from './AppUtil';
import dataPreferences from '@ohos.data.preferences';
export const DEFAULT_PREFERENCE_NAME: string = "SP_HARMONY_UTILS_PREFERENCES"; // Preferences实例的名称。

/**
 * Preferences工具类
 * @author CSDN-鸿蒙布道师
 * @since 2025/04/09
 */
export class PreferencesUtil {

  private static defaultPreferenceName: string = DEFAULT_PREFERENCE_NAME;
  private static preferences: dataPreferences.Preferences;

  /**
   * 初始化Preferences实例(非必要不要初始化该方法)。
   * @param preferenceName Preferences实例的名称。
   */
  static init(preferenceName: string) {
    if (!PreferencesUtil.preferences || preferenceName !== PreferencesUtil.defaultPreferenceName) {
      PreferencesUtil.defaultPreferenceName = preferenceName;
      PreferencesUtil.preferences = dataPreferences.getPreferencesSync(AppUtil.getContext(), { name: preferenceName });
    }
  }

  /**
   * 获取Preferences实例。
   * @param preferenceName 实例名称。
   * @returns Preferences实例。
   */
  private static async getPreferences(preferenceName: string = PreferencesUtil.defaultPreferenceName): Promise {
    if (preferenceName !== PreferencesUtil.defaultPreferenceName || !PreferencesUtil.preferences) {
      PreferencesUtil.preferences = await dataPreferences.getPreferences(AppUtil.getContext(), preferenceName);
    }
    return PreferencesUtil.preferences;
  }

  /**
   * 同步获取Preferences实例。
   * @param preferenceName 实例名称。
   * @returns Preferences实例。
   */
  private static getPreferencesSync(preferenceName: string = PreferencesUtil.defaultPreferenceName): dataPreferences.Preferences {
    if (preferenceName !== PreferencesUtil.defaultPreferenceName || !PreferencesUtil.preferences) {
      PreferencesUtil.preferences = dataPreferences.getPreferencesSync(AppUtil.getContext(), { name: preferenceName });
    }
    return PreferencesUtil.preferences;
  }

  /**
   * 将数据缓存到指定的Preferences实例中。
   * @param key 键。
   * @param value 值。
   * @param preferenceName 实例名称。
   */
  static putSync(key: string, value: dataPreferences.ValueType, preferenceName: string = PreferencesUtil.defaultPreferenceName) {
    PreferencesUtil.performSyncAction(preferenceName, (preferences) => {
      preferences.putSync(key, value);
      preferences.flush(); // 确保数据永久序列化到本地
    });
  }

  static async put(key: string, value: dataPreferences.ValueType, preferenceName: string = PreferencesUtil.defaultPreferenceName) {
    await PreferencesUtil.performAsyncAction(preferenceName, async (preferences) => {
      await preferences.put(key, value);
      await preferences.flush(); // 确保数据永久序列化到本地
    });
  }

  /**
   * 获取缓存值(同步)。
   * @param key 键。
   * @param defValue 默认值。
   * @param preferenceName 实例名称。
   * @returns 缓存值。
   */
  static getSync(key: string, defValue: T, preferenceName: string = PreferencesUtil.defaultPreferenceName): T {
    return PreferencesUtil.performSyncAction(preferenceName, (preferences) => preferences.getSync(key, defValue)) as T;
  }

  /**
   * 获取缓存值(异步)。
   * @param key 键。
   * @param defValue 默认值。
   * @param preferenceName 实例名称。
   * @returns 缓存值。
   */
  static async get(key: string, defValue: T, preferenceName: string = PreferencesUtil.defaultPreferenceName): Promise {
    return PreferencesUtil.performAsyncAction(preferenceName, async (preferences) => await preferences.get(key, defValue)) as Promise;
  }

  /**
   * 删除指定键的缓存值。
   * @param key 键。
   * @param preferenceName 实例名称。
   */
  static deleteSync(key: string, preferenceName: string = PreferencesUtil.defaultPreferenceName) {
    PreferencesUtil.performSyncAction(preferenceName, (preferences) => {
      preferences.deleteSync(key);
      preferences.flush(); // 确保数据永久序列化到本地
    });
  }

  static async delete(key: string, preferenceName: string = PreferencesUtil.defaultPreferenceName) {
    await PreferencesUtil.performAsyncAction(preferenceName, async (preferences) => {
      await preferences.delete(key);
      await preferences.flush(); // 确保数据永久序列化到本地
    });
  }

  /**
   * 清空所有缓存数据。
   * @param preferenceName 实例名称。
   */
  static clearSync(preferenceName: string = PreferencesUtil.defaultPreferenceName) {
    PreferencesUtil.performSyncAction(preferenceName, (preferences) => {
      preferences.clearSync();
      preferences.flush(); // 确保数据永久序列化到本地
    });
  }

  static async clear(preferenceName: string = PreferencesUtil.defaultPreferenceName) {
    await PreferencesUtil.performAsyncAction(preferenceName, async (preferences) => {
      await preferences.clear();
      await preferences.flush(); // 确保数据永久序列化到本地
    });
  }

  /**
   * 检查是否包含指定键。
   * @param key 键。
   * @param preferenceName 实例名称。
   * @returns 是否包含。
   */
  static hasSync(key: string, preferenceName: string = PreferencesUtil.defaultPreferenceName): boolean {
    return PreferencesUtil.performSyncAction(preferenceName, (preferences) => preferences.hasSync(key));
  }

  static async has(key: string, preferenceName: string = PreferencesUtil.defaultPreferenceName): Promise {
    return PreferencesUtil.performAsyncAction(preferenceName, async (preferences) => await preferences.has(key));
  }

  /**
   * 订阅数据变更。
   * @param callback 回调函数。
   * @param preferenceName 实例名称。
   */
  static onChange(callback: Callback, preferenceName: string = PreferencesUtil.defaultPreferenceName) {
    PreferencesUtil.performSyncAction(preferenceName, (preferences) => preferences.on('change', callback));
  }

  static offChange(callback?: Callback, preferenceName: string = PreferencesUtil.defaultPreferenceName) {
    PreferencesUtil.performSyncAction(preferenceName, (preferences) => {
      if (callback) {
        preferences.off('change', callback);
      } else {
        preferences.off('change');
      }
    });
  }

  /**
   * 辅助方法:执行同步操作。
   * @param preferenceName 实例名称。
   * @param action 执行的操作。
   * @returns 操作的结果。
   */
  private static performSyncAction(preferenceName: string, action: (preferences: dataPreferences.Preferences) => T): T {
    const preferences = PreferencesUtil.getPreferencesSync(preferenceName);
    return action(preferences); // 确保返回操作的结果
  }

  /**
   * 辅助方法:执行异步操作。
   * @param preferenceName 实例名称。
   * @param action 执行的操作。
   */
  private static async performAsyncAction(preferenceName: string, action: (preferences: dataPreferences.Preferences) => Promise): Promise {
    const preferences = await PreferencesUtil.getPreferences(preferenceName);
    return action(preferences);
  }
}

你可能感兴趣的:(鸿蒙NEXT开发工具箱,华为,huawei,鸿蒙系统,harmonyos,ArkTs,android,ios)