PerferencesUtil.ets 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import preferences from '@ohos.data.preferences';
  2. import common from '@ohos.app.ability.common';
  3. // 定义支持的数据类型
  4. type ValueType = number | string | boolean | number[] | string[] | boolean[];
  5. type PreferencesData = Record<string, ValueType>;
  6. class PreferencesUtil {
  7. // 缓存多个 Preferences 实例
  8. private prefMap: Map<string, preferences.Preferences> = new Map();
  9. /**
  10. * 加载 Preferences 文件
  11. * @param context 应用上下文
  12. * @param name 文件名(如 'userConfig')
  13. */
  14. async loadPreference(context: common.Context, name: string): Promise<void> {
  15. try {
  16. const pref = await preferences.getPreferences(context, name);
  17. this.prefMap.set(name, pref);
  18. console.log(`[PreferencesUtil] 加载文件 "${name}" 成功`);
  19. } catch (err) {
  20. console.error(`[PreferencesUtil] 加载失败: ${JSON.stringify(err)}`);
  21. }
  22. }
  23. /**
  24. * 写入数据(自动刷盘)
  25. * @param fileName 文件名
  26. * @param key 键名
  27. * @param value 值(支持6种类型)
  28. */
  29. async put(fileName: string, key: string, value: ValueType): Promise<void> {
  30. const pref = this.prefMap.get(fileName);
  31. if (!pref) {
  32. console.warn(`[PreferencesUtil] 文件未加载: ${fileName}`);
  33. return;
  34. }
  35. try {
  36. await pref.put(key, value);
  37. await pref.flush(); // 立即持久化
  38. console.log(`[PreferencesUtil] 保存 ${fileName}.${key} = ${value}`);
  39. } catch (err) {
  40. console.error(`[PreferencesUtil] 写入失败: ${JSON.stringify(err)}`);
  41. }
  42. }
  43. /**
  44. * 读取数据(带默认值)
  45. * @param fileName 文件名
  46. * @param key 键名
  47. * @param defaultValue 默认值
  48. * @returns 类型安全的返回值
  49. */
  50. async get<T extends ValueType>(
  51. fileName: string,
  52. key: string,
  53. defaultValue: T
  54. ): Promise<T> {
  55. const pref = this.prefMap.get(fileName);
  56. if (!pref) {
  57. console.warn(`[PreferencesUtil] 文件未加载: ${fileName}`);
  58. return defaultValue;
  59. }
  60. try {
  61. const value = await pref.get(key, defaultValue);
  62. console.log(`[PreferencesUtil] 读取 ${fileName}.${key} = ${value}`);
  63. return value as T; // 泛型类型断言
  64. } catch (err) {
  65. console.error(`[PreferencesUtil] 读取失败: ${JSON.stringify(err)}`);
  66. return defaultValue;
  67. }
  68. }
  69. /**
  70. * 删除指定键值
  71. * @param fileName 文件名
  72. * @param key 键名
  73. */
  74. async delete(fileName: string, key: string): Promise<void> {
  75. const pref = this.prefMap.get(fileName);
  76. if (!pref) return;
  77. try {
  78. await pref.delete(key);
  79. await pref.flush();
  80. console.log(`[PreferencesUtil] 删除键值: ${fileName}.${key}`);
  81. } catch (err) {
  82. console.error(`[PreferencesUtil] 删除失败: ${JSON.stringify(err)}`);
  83. }
  84. }
  85. /**
  86. * 清空文件数据
  87. * @param fileName 文件名
  88. */
  89. async clear(fileName: string): Promise<void> {
  90. const pref = this.prefMap.get(fileName);
  91. if (!pref) return;
  92. try {
  93. await pref.clear();
  94. await pref.flush();
  95. console.log(`[PreferencesUtil] 已清空文件: ${fileName}`);
  96. } catch (err) {
  97. console.error(`[PreferencesUtil] 清空失败: ${JSON.stringify(err)}`);
  98. }
  99. }
  100. }
  101. // 导出单例(全局使用)
  102. const preferencesUtil = new PreferencesUtil();
  103. export default preferencesUtil;