[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%')}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83692.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83692.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83692.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

利用html制作簡歷網頁和求職信息網頁

前言 大家好&#xff0c;我是maybe。今天下午初步學習了html的基礎知識。做了兩個小網頁&#xff0c;一個網頁是簡歷網頁&#xff0c;一個網頁是求職信息填寫網頁。跟大家分享一波~ 說明:我不打算上傳圖片。所以如果有朋友按照我的代碼運行網頁&#xff0c;會出現一個沒有圖片…

Vue 3 實現后端 Excel 文件流導出功能(Blob 下載詳解)

&#x1f4a1; 本文以告警信息導出為例&#xff0c;介紹 Vue 3 中如何通過 Axios 調用后端接口并處理文件流&#xff0c;實現 Excel 自動下載功能。 &#x1f4d1; 目錄 一、前言 二、后端接口說明 三、前端實現思路 四、導出功能完整代碼 五、常見問題處理 六、效果展示 …

HarmonyOS AVPlayer 音頻播放器

鴻蒙文檔中心&#xff1a;使用AVPlayer播放視頻(ArkTS)文檔中心https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/video-playback 這張圖描述的是 HarmonyOS AVPlayer 音頻播放器的狀態流轉過程&#xff0c;展示了 AVPlayer 在不同狀態之間的切換條件和關鍵操作…

Java面試場景:從音視頻到AI應用的技術探討

面試場景&#xff1a;音視頻與AI應用技術的碰撞 在某互聯網大廠的面試中&#xff0c;面試官王先生與求職者明哥展開了一場關于音視頻技術與AI應用的對話。 第一輪提問&#xff1a;音視頻場景 面試官&#xff1a;明哥&#xff0c;你能談談在音視頻場景中&#xff0c;Spring B…

【深度學習】殘差網絡(ResNet)

如果按照李沐老師書上來&#xff0c;學完 VGG 后還有 NiN 和 GoogLeNet 要學&#xff0c;但是這兩個我之前聽都沒聽過&#xff0c;而且我看到我導師有發過 ResNet 相關的論文&#xff0c;就想跳過它們直接看后面的內容。 現在看來這不算是不踏實&#xff0c;因為李沐老師說如果…

Vue3學習(組合式API——父、子組件間通信詳解)

目錄 一、組合式API下的父組件傳子組件。(自定義屬性) &#xff08;1&#xff09;基本思想。 &#xff08;2&#xff09;核心注意點。(defineProps) &#xff08;3&#xff09;傳遞簡單類型數據。 &#xff08;4&#xff09;傳遞對象類型數據。(v-bind"對象類型數據"…

W5500使用ioLibrary庫創建TCP客戶端

1、WIZnet全硬件TCP/IP協議棧 WIZnet全硬件TCP/IP協議棧,支持TCP,UDP,IPv4,ICMP,ARP,IGMP以及PPPoE協議。 以太網&#xff1a;支持BSD和WIZCHIP&#xff08;W5500/W5300/W5200/W5100/W5100S&#xff09;的SOCKET APIs驅動程序。 互聯網&#xff1a; DHCP客戶端 DNS客戶端 FTP客…

管理Oracle Data Guard的最佳實踐

Oracle Data Guard的中文名字叫數據衛士&#xff0c;顧名思義&#xff0c;它是生產庫的一道保障。所以管理Data Guard是DBA的一項重要工作之一&#xff0c;管理Data Guard時主要有以下幾個注意點需要引起重視。 備份庫的歸檔日志積壓 一般情況下&#xff0c;生產庫的歸檔日志是…

BootCDN介紹(Bootstrap主導的前端開源項目免費CDN加速服務)

文章目錄 BootCDN前端開源項目CDN加速服務全解析什么是BootCDN技術原理與架構CDN技術基礎BootCDN架構特點1. 全球分布式節點網絡2. 智能DNS解析系統3. 高效緩存管理機制4. 自動同步更新機制5. HTTPS和HTTP/2協議支持 BootCDN的核心優勢速度與穩定性開源免費資源豐富度技術規范遵…

2025 Java 微信小程序根據code獲取openid,二次code獲取手機號【工具類】拿來就用

一、controller調用 /*** 登錄** author jiaketao* since 2024-04-10*/ RestController RequestMapping("/login") public class LoginController {/*** 【小程序】登錄獲取session_key和openid** param code 前端傳code* return*/GetMapping("/getWXSessionKe…

軟件架構風格系列(3):管道 - 過濾器架構

文章目錄 前言一、從生活場景到架構原理&#xff0c;看懂管道 - 過濾器的核心邏輯&#xff08;一&#xff09;什么是管道 - 過濾器架構&#xff1f;&#xff08;二&#xff09;核心組件拆解 二、架構設計圖&#xff1a;一圖看懂管道 - 過濾器架構全貌三、Java 示例代碼&#xf…

【VIM】vim 常用命令

文章目錄 插入模式光標移動拷貝/粘貼/刪除/撤銷塊操作分屏代碼縮進命令組合使用其他PowerVim 前言&#xff1a;本文內容大部分摘抄自酷殼和博客園 ? – ? CoolShell – 陳皓 ? 博客園 – 易先訊 插入模式 a → 在光標后插入o → 在當前行后插入一個新行O → 在當前行前插…

polarctf-web-[簡單rce]

考點&#xff1a; (1)RCE(eval函數) (2)執行函數(passthru函數) (3)/頂級(根)目錄查看 (4)sort排序查看函數 題目來源&#xff1a;Polarctf-web-[簡單rce] 解題&#xff1a; 代碼審計 <?php/*?PolarD&N CTF?*/highlight_file(__FILE__);function no($txt){ # …

HarmonyOs開發之———使用HTTP訪問網絡資源

謝謝關注&#xff01;&#xff01; 前言&#xff1a;上一篇文章主要介紹HarmonyOs開發之———Video組件的使用:HarmonyOs開發之———Video組件的使用_華為 video標簽查看-CSDN博客 HarmonyOS 網絡開發入門&#xff1a;使用 HTTP 訪問網絡資源 HarmonyOS 作為新一代智能終端…

Vue 圖片預覽功能(含縮略圖)

眾所周知&#xff0c;常見的組件庫如Element、Ant Design&#xff0c;自帶的圖片預覽功能都沒有縮略圖&#xff0c;所以 需要單獨封裝一個圖片預覽的服務。 第三方庫&#xff1a;v-viewer 安裝&#xff1a; npm install v-viewer viewerjs 若使用報錯&#xff0c;可安裝指定…

手寫tomcat:基本功能實現(4)

邏輯架構 HTTP 請求與 Socket&#xff1a; 左側的 “HTTP 請求” 箭頭指向 “socket”&#xff0c;表示客戶端發送的 HTTP 請求通過 socket 傳輸到服務器。Socket 負責接收請求&#xff0c;并提取出其中的 請求路徑&#xff08;如 /first&#xff09;和 請求方法&#xff08;如…

jvm安全點(一)openjdk17 c++源碼垃圾回收安全點信號函數處理線程阻塞

1. 信號處理入口?? ??JVM_HANDLE_XXX_SIGNAL?? 是 JVM 處理信號的統一入口&#xff0c;負責處理 SIGSEGV、SIGBUS 等信號。??javaSignalHandler?? 是實際注冊到操作系統的信號處理函數&#xff0c;直接調用 JVM_HANDLE_XXX_SIGNAL。 ??2. 安全點輪詢頁的識別?? …

微信小程序:封裝表格組件并引用

一、效果 封裝表格組件,在父頁面中展示表格組件并顯示數據 二、表格組件 1、創建頁面 創建一個components文件夾,專門用于存儲組件的文件夾 創建Table表格組件 2、視圖層 (1)表頭數據 這里會從父組件中傳遞表頭數據,這里為columns,后續會講解數據由來 循環表頭數組,…

【FMC216】基于 VITA57.1 的 2 路 TLK2711 發送、2 路 TLK2711 接收 FMC 子卡模塊

產品概述 FMC216 是一款基于 VITA57.1 標準規范的 2 路 TLK2711 接收、2 路 TLK2711 發送 FMC 子卡模塊。該板卡支持 2 路 TLK2711 數據的收發&#xff0c;支持線速率 1.6Gbps&#xff0c;經過 TLK2711 高速串行收發器&#xff0c;可以將 1.6Gbps 的高速串行數據解串為 16 位并…

K8S Gateway API 快速開始、胎教級教程

假設有如下三個節點的 K8S 集群&#xff1a; ?? k8s31master 是控制節點 k8s31node1、k8s31node2 是工作節點 容器運行時是 containerd 一、Gateway 是什么 背景和目的 入口&#xff08;Ingress&#xff09;目前已停止更新。新的功能正在集成至網關 API 中。在 Kubernetes …