|
@@ -0,0 +1,115 @@
|
|
|
+import preferences from '@ohos.data.preferences';
|
|
|
+import common from '@ohos.app.ability.common';
|
|
|
+
|
|
|
+// 定义支持的数据类型
|
|
|
+type ValueType = number | string | boolean | number[] | string[] | boolean[];
|
|
|
+type PreferencesData = Record<string, ValueType>;
|
|
|
+
|
|
|
+class PreferencesUtil {
|
|
|
+ // 缓存多个 Preferences 实例
|
|
|
+ private prefMap: Map<string, preferences.Preferences> = new Map();
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 加载 Preferences 文件
|
|
|
+ * @param context 应用上下文
|
|
|
+ * @param name 文件名(如 'userConfig')
|
|
|
+ */
|
|
|
+ async loadPreference(context: common.Context, name: string): Promise<void> {
|
|
|
+ try {
|
|
|
+ const pref = await preferences.getPreferences(context, name);
|
|
|
+ this.prefMap.set(name, pref);
|
|
|
+ console.log(`[PreferencesUtil] 加载文件 "${name}" 成功`);
|
|
|
+ } catch (err) {
|
|
|
+ console.error(`[PreferencesUtil] 加载失败: ${JSON.stringify(err)}`);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 写入数据(自动刷盘)
|
|
|
+ * @param fileName 文件名
|
|
|
+ * @param key 键名
|
|
|
+ * @param value 值(支持6种类型)
|
|
|
+ */
|
|
|
+ async put(fileName: string, key: string, value: ValueType): Promise<void> {
|
|
|
+ const pref = this.prefMap.get(fileName);
|
|
|
+ if (!pref) {
|
|
|
+ console.warn(`[PreferencesUtil] 文件未加载: ${fileName}`);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ await pref.put(key, value);
|
|
|
+ await pref.flush(); // 立即持久化
|
|
|
+ console.log(`[PreferencesUtil] 保存 ${fileName}.${key} = ${value}`);
|
|
|
+ } catch (err) {
|
|
|
+ console.error(`[PreferencesUtil] 写入失败: ${JSON.stringify(err)}`);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读取数据(带默认值)
|
|
|
+ * @param fileName 文件名
|
|
|
+ * @param key 键名
|
|
|
+ * @param defaultValue 默认值
|
|
|
+ * @returns 类型安全的返回值
|
|
|
+ */
|
|
|
+ async get<T extends ValueType>(
|
|
|
+ fileName: string,
|
|
|
+ key: string,
|
|
|
+ defaultValue: T
|
|
|
+ ): Promise<T> {
|
|
|
+ const pref = this.prefMap.get(fileName);
|
|
|
+ if (!pref) {
|
|
|
+ console.warn(`[PreferencesUtil] 文件未加载: ${fileName}`);
|
|
|
+ return defaultValue;
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ const value = await pref.get(key, defaultValue);
|
|
|
+ console.log(`[PreferencesUtil] 读取 ${fileName}.${key} = ${value}`);
|
|
|
+ return value as T; // 泛型类型断言
|
|
|
+ } catch (err) {
|
|
|
+ console.error(`[PreferencesUtil] 读取失败: ${JSON.stringify(err)}`);
|
|
|
+ return defaultValue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 删除指定键值
|
|
|
+ * @param fileName 文件名
|
|
|
+ * @param key 键名
|
|
|
+ */
|
|
|
+ async delete(fileName: string, key: string): Promise<void> {
|
|
|
+ const pref = this.prefMap.get(fileName);
|
|
|
+ if (!pref) return;
|
|
|
+
|
|
|
+ try {
|
|
|
+ await pref.delete(key);
|
|
|
+ await pref.flush();
|
|
|
+ console.log(`[PreferencesUtil] 删除键值: ${fileName}.${key}`);
|
|
|
+ } catch (err) {
|
|
|
+ console.error(`[PreferencesUtil] 删除失败: ${JSON.stringify(err)}`);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 清空文件数据
|
|
|
+ * @param fileName 文件名
|
|
|
+ */
|
|
|
+ async clear(fileName: string): Promise<void> {
|
|
|
+ const pref = this.prefMap.get(fileName);
|
|
|
+ if (!pref) return;
|
|
|
+
|
|
|
+ try {
|
|
|
+ await pref.clear();
|
|
|
+ await pref.flush();
|
|
|
+ console.log(`[PreferencesUtil] 已清空文件: ${fileName}`);
|
|
|
+ } catch (err) {
|
|
|
+ console.error(`[PreferencesUtil] 清空失败: ${JSON.stringify(err)}`);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 导出单例(全局使用)
|
|
|
+const preferencesUtil = new PreferencesUtil();
|
|
|
+export default preferencesUtil;
|