当前位置: 首页 > 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%')}
}

http://www.xdnf.cn/news/455977.html

相关文章:

  • Aquatone安装与使用
  • 科学养生指南:解锁健康生活的密码
  • Kind方式部署k8s单节点集群并创建nginx服务对外访问
  • 渗透测试流程-上篇
  • 养生:解锁健康生活的核心密码
  • 磁盘I/O瓶颈排查:面试通关“三部曲”心法
  • Python logging模块使用指南
  • 争对机器学习和深度学习里Python项目开发管理项目依赖的工具中方便第三方库和包的安装
  • 用FileCodeBox打造私有文件传输:Ubuntu环境保姆级部署教程!
  • 《C++ vector详解》
  • Python----神经网络(基于DNN的风电功率预测)
  • GpuGeek:为创新者提供灵活、快速、高效的云计算服务!
  • PHP基础知识
  • 以项目的方式学QT开发(二)
  • Apple Vision Pro空间视频创作革命:从180度叙事到沉浸式语法的重构——《Adventure》系列幕后技术深度解析
  • AI浪潮:开启科技新纪元
  • 数据分析NumPy
  • wps excel将表格输出pdf时所有列在一张纸上
  • RabbitMQ 消息模式实战:从简单队列到复杂路由(一)
  • 数据可视化-----子图的绘制及坐标轴的共享
  • C语言经典笔试题目分析(持续更新)
  • conda更换清华源
  • Spring Cloud探索之旅:从零搭建微服务雏形 (Eureka, LoadBalancer 与 OpenFeign实战)
  • Synchronized详解及高频面试问答
  • CSRF 和 XSS 攻击分析与防范
  • Python爬虫第21节- 基础图形验证码识别实战
  • 前端的面试笔记——JavaScript篇(二)
  • 数字孪生工厂实战指南:基于Unreal Engine/Omniverse的虚实同步系统开发
  • 图像颜色理论与数据挖掘应用的全景解析
  • OrangePi Zero 3学习笔记(Android篇)9 - I2C和从设备