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