[Harmony]封装一个可视化的数据持久化工具

1.添加权限

在module.json5文件中添加权限

// 声明应用需要请求的权限列表
"requestPermissions": [
  {
    "name": "ohos.permission.DISTRIBUTED_DATASYNC", // 权限名称:分布式数据同步权限
    "reason": "$string:distributed_database_reason",// 权限使用原因说明(引用string资源)
    "usedScene": { // 权限使用场景配置
      "abilities": ["MFStorageManager"], // 声明需要使用该权限的Ability列表
      "when": "always" // 权限调用时机:always表示始终需要
    }
  }
]

/resources/base/element/string.json

{
  "string": [
    {
      "name": "distributed_database_reason",
      "value": "用于保存用户配置信息"
    }
  ]
}

2.封装可视化数据持久工具

import preferences from '@ohos.data.preferences';
import { BusinessError } from '@ohos.base';
import ConsoleLog from '../extension/ConsoleLog';
import { isBlank } from '../extension/StringExtensions';

/**
 * 配置项类型定义
 * @property key - 存储键名(建议使用下划线命名法)
 * @property defaultValue - 默认值(必须为字符串类型)
 * @property valueType - 值类型声明(用于类型校验)
 */
interface StoragePreferenceItem {
  key: string;
  defaultValue: string;
  valueType: 'string';
}

export class MFStorageManager {
  /**
   * 预定义配置项列表
   * @remark 使用readonly确保配置不可变
   * @remark valueType使用类型断言保证字面量类型
   */
  private static readonly CONFIG_LIST: StoragePreferenceItem[] = [
    { key: 'token', defaultValue: '', valueType: 'string' },
    { key: 'user_id', defaultValue: '', valueType: 'string' },
    { key: 'last_login', defaultValue: '', valueType: 'string' }
  ];

  // 存储实例引用
  private static prefs: preferences.Preferences | null = null;

  /**
   * 初始化配置管理器
   * @param context - 应用上下文对象
   * @throws 当底层存储初始化失败时记录错误日志
   */
  static async initialize(context: Context): Promise<void> {
    try {
      MFStorageManager.prefs = await preferences.getPreferences(context, 'app_config');
      await MFStorageManager.checkDefaults();
      await AppDataSingleton.getInstance().syncFromStorage();
      ConsoleLog.log('配置管理器初始化完成');
    } catch (err) {
      ConsoleLog.error(`初始化失败: ${(err as BusinessError).message}`);
    }
  }

  /**
   * 配置项默认值检查
   * @remark 自动填充未初始化的配置项
   * @private 内部方法
   */
  private static async checkDefaults(): Promise<void> {
    if (!MFStorageManager.prefs) return;
    for (const item of MFStorageManager.CONFIG_LIST) {
      const current = await MFStorageManager.prefs.get(item.key, item.defaultValue);
      if (current === item.defaultValue) {
        await MFStorageManager.prefs.put(item.key, item.defaultValue);
      }
    }
    await MFStorageManager.prefs.flush();
  }

  /**
   * 获取配置值
   * @param key - 目标配置键
   * @returns 配置值的字符串形式
   * @throws 未初始化或无效键名时抛出错误
   */
  static async get(key: string): Promise<string> {
    if (!MFStorageManager.prefs) {
      ConsoleLog.error('请先调用StorageManager的initialize初始化');
      return "";
    }
    const target = MFStorageManager.CONFIG_LIST.find(item => item.key === key);
    if (!target) {
      ConsoleLog.error(`无效的配置项: ${key}`);
      return "";
    }
    return await MFStorageManager.prefs.get(target.key, target.defaultValue) as string;
  }

  /**
   * 更新配置值
   * @param key - 目标配置键
   * @param value - 新字符串值
   * @throws 未初始化或无效键名时抛出错误
   */
  static async set(key: string, value: string): Promise<void> {
    if (!MFStorageManager.prefs) {
      ConsoleLog.error('请先调用StorageManager的initialize初始化');
      return;
    }
    const target = MFStorageManager.CONFIG_LIST.find(item => item.key === key);
    if (!target) {
      ConsoleLog.error(`无效的配置项: ${key}`);
      return;
    }
    await MFStorageManager.prefs.put(target.key, value);
    await MFStorageManager.prefs.flush();

    // 同步更新单例数据
    const instance = AppDataSingleton.getInstance();
    switch(key) {
      case 'token': instance.token = value; break;
      case 'user_id': instance.user_id = value; break;
      case 'last_login': instance.last_login = value; break;
    }
  }

  /**
   * 选择性清除缓存数据
   * @param ignoredKeys - 需要保留的键名数组
   * @remark 保留的配置项将保持当前值不变
   */
  static async cleanData(ignoredKeys: string[] = []): Promise<void> {
    if (!MFStorageManager.prefs) {
      ConsoleLog.error('请先调用StorageManager的initialize初始化');
      return;
    }
    // 获取需要清理的配置项(排除忽略字段)
    const needCleanItems = MFStorageManager.CONFIG_LIST.filter(
      item => !ignoredKeys.includes(item.key)
    );

    // 批量重置为默认值
    for (const item of needCleanItems) {
      await MFStorageManager.prefs.put(item.key, item.defaultValue);
      // 同步重置单例数据
      const instance = AppDataSingleton.getInstance();
      switch(item.key) {
        case 'token': instance.token = item.defaultValue; break;
        case 'user_id': instance.user_id = item.defaultValue; break;
        case 'last_login': instance.last_login = item.defaultValue; break;
      }
    }

    await MFStorageManager.prefs.flush();
    ConsoleLog.log('缓存清理完成,忽略字段:', ignoredKeys);
  }
}

/**
 * 用单例同步持久化的数据,避免每次使用数据都要去preferences中获取。
 */
class AppDataSingleton {
  private static instance: AppDataSingleton;
  token: string = '';
  user_id: string = '';
  last_login: string = '';

  private constructor() {}

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

  /// 同步数据
  public async syncFromStorage() {
    this.token = await MFStorageManager.get('token');
    this.user_id = await MFStorageManager.get('user_id');
    this.last_login = await MFStorageManager.get('last_login');
  }

  /// 是否登录
  isLogin(): boolean {
    return isBlank(this.token) ? false : true;
	}

}
export const AppStorageData = AppDataSingleton.getInstance();

自定义ConsoleLog为打印添加前缀,便于筛选出自己的打印的内容。

/// 为console打印添加前缀
class ConsoleLog {
  private static readonly PREFIX: string = 'gamin';

  static log(...args: (string | number | boolean | object)[]): void {
    console.log(ConsoleLog.PREFIX, ...args);
  }

  static error(...args: (string | number | boolean | object)[]): void {
    console.error(ConsoleLog.PREFIX, ...args);
  }

  static warn(...args: (string | number | boolean | object)[]): void {
    console.warn(ConsoleLog.PREFIX, ...args);
  }

  static debug(...args: (string | number | boolean | object)[]): void {
    console.debug(ConsoleLog.PREFIX, ...args);
  }

  static info(...args: (string | number | boolean | object)[]): void {
    console.info(ConsoleLog.PREFIX, ...args);
  }
}

export default ConsoleLog;

3.使用示例

import { MFStorageManager } from '../support/data/MFStorageManager';
import common from '@ohos.app.ability.common';
import ConsoleLog from '../support/extension/ConsoleLog';

@Entry
@Component
struct Index {
  private context = getContext(this) as common.UIAbilityContext;

  aboutToAppear() {
    if (!this.context) {
      ConsoleLog.error('无效的上下文对象');
      return;
    }
    // 初始化配置管理器
    MFStorageManager.initialize(this.context)
  }

  build() {
    Column() {
      Button("设置用户ID")
        .onClick(() => {
          MFStorageManager.set('user_id', 'user_123456');
          ConsoleLog.log('用户ID设置成功');
        })

      Button("获取用户ID")
        .onClick(async () => {
          const userId = await MFStorageManager.get('user_id');
          ConsoleLog.log('当前用户ID:', userId);
        })

      Button('清除缓存(保留用户ID)')
        .onClick(async () => {
          // 选择性清除配置
          try {
            await MFStorageManager.cleanData(['user_id']);
            ConsoleLog.log('缓存已清除(保留用户ID)');
          } catch (err) {
            ConsoleLog.error('清除失败:', err);
          }
        })
    }
    .height('100%')
    .width('100%')
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值