当前位置: 首页 > news >正文

[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';/*** 配置项类型定义* @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: 'user_id',defaultValue: '',valueType: 'string'},{key: 'auth_token',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();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();}/*** 选择性清除缓存数据* @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);}await MFStorageManager.prefs.flush();ConsoleLog.log('缓存清理完成,忽略字段:', ignoredKeys);}
}

自定义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%')}
}

相关文章:

  • 蓝桥杯12届国B 123
  • 数据结构——例题2
  • [数据结构]8. 树-Tree
  • 基于YOLO算法的目标检测系统实现指南
  • Reactor模型详解与C++实现
  • 虚拟Python 环境构建器virtualenv安装(macOS版)
  • 小白上手RPM包制作
  • Obsidian Callouts标注框语法
  • 【python】字典:: a list of dictionaries
  • 在Rocky Linux 9.5上部署MongoDB 8.0.9:从安装到认证的完整指南
  • 项目变更管理
  • 【Android】Android 实现一个依赖注入的注解
  • 互联网医院系统源码解析:药店APP开发的技术架构与实现难点
  • 开源GPU架构RISC-V VCIX的深度学习潜力测试:从RTL仿真到MNIST实战
  • PromptIDE提示词开发工具支持定向优化啦
  • Elasticsearch性能调优全攻略:从日志分析到集群优化
  • 数据结构中链表的含义与link
  • Blender 入门教程(三):骨骼绑定
  • undefined reference to CPUAllocatorSingleton::instance
  • 访问 Docker 官方镜像源(包括代理)全部被“重置连接”或超时
  • 《日出》华丽的悲凉,何赛飞和赵文瑄演绎出来了
  • 刘晓庆被实名举报涉嫌偷税漏税,税务部门启动调查
  • 河南省委常委会会议:坚持以案为鉴,深刻汲取教训
  • GDP逼近五千亿,向海图强,对接京津,沧州剑指沿海经济强市
  • 福建宁德市长张永宁拟任设区市党委正职,曾获评全国优秀县委书记
  • 2025年上海科技节5月17日启动,56家重点实验室和大科学设施将向公众开放