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