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<dataPreferences.Preferences> {
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<T extends dataPreferences.ValueType>(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<T extends dataPreferences.ValueType>(key: string, defValue: T, preferenceName: string = PreferencesUtil.defaultPreferenceName): Promise<T> {
return PreferencesUtil.performAsyncAction(preferenceName, async (preferences) => await preferences.get(key, defValue)) as Promise<T>;
}
/**
* 删除指定键的缓存值。
* @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<boolean> {
return PreferencesUtil.performAsyncAction(preferenceName, async (preferences) => await preferences.has(key));
}
/**
* 订阅数据变更。
* @param callback 回调函数。
* @param preferenceName 实例名称。
*/
static onChange(callback: Callback<string>, preferenceName: string = PreferencesUtil.defaultPreferenceName) {
PreferencesUtil.performSyncAction(preferenceName, (preferences) => preferences.on('change', callback));
}
static offChange(callback?: Callback<string>, 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<T>(preferenceName: string, action: (preferences: dataPreferences.Preferences) => T): T {
const preferences = PreferencesUtil.getPreferencesSync(preferenceName);
return action(preferences); // 确保返回操作的结果
}
/**
* 辅助方法:执行异步操作。
* @param preferenceName 实例名称。
* @param action 执行的操作。
*/
private static async performAsyncAction<T>(preferenceName: string, action: (preferences: dataPreferences.Preferences) => Promise<T>): Promise<T> {
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<dataPreferences.Preferences> {
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<T extends dataPreferences.ValueType>(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<T extends dataPreferences.ValueType>(key: string, defValue: T, preferenceName: string = PreferencesUtil.defaultPreferenceName): Promise<T> {
return PreferencesUtil.performAsyncAction(preferenceName, async (preferences) => await preferences.get(key, defValue)) as Promise<T>;
}
/**
* 删除指定键的缓存值。
* @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<boolean> {
return PreferencesUtil.performAsyncAction(preferenceName, async (preferences) => await preferences.has(key));
}
/**
* 订阅数据变更。
* @param callback 回调函数。
* @param preferenceName 实例名称。
*/
static onChange(callback: Callback<string>, preferenceName: string = PreferencesUtil.defaultPreferenceName) {
PreferencesUtil.performSyncAction(preferenceName, (preferences) => preferences.on('change', callback));
}
static offChange(callback?: Callback<string>, 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<T>(preferenceName: string, action: (preferences: dataPreferences.Preferences) => T): T {
const preferences = PreferencesUtil.getPreferencesSync(preferenceName);
return action(preferences); // 确保返回操作的结果
}
/**
* 辅助方法:执行异步操作。
* @param preferenceName 实例名称。
* @param action 执行的操作。
*/
private static async performAsyncAction<T>(preferenceName: string, action: (preferences: dataPreferences.Preferences) => Promise<T>): Promise<T> {
const preferences = await PreferencesUtil.getPreferences(preferenceName);
return action(preferences);
}
}