鸿蒙开发 distributedKVStore 存储数据无效问题

背景

在开发鸿蒙时, 使用 distributedKVStore.KVManager 分布式键值数据库储存数据时, 发现存储的数据, 重启 app 就获取不到了

代码

typescript 复制代码
import distributedKVStore from '@ohos.data.distributedKVStore'

/**
 * 分布式键值数据库 管理器
 * 使用 SingleKVStore, 数据不对设备进行区分
 * 数据库配置已固定, 后期如有需要再提供更多配置
 * 提供读写方法
 * 对 Promise的使用可能不成熟, 待进一步学习后改进
 */

// 类型别名
type BooleanCallback = (Boolean) => string;

export default class KeyStorageManager {
  private config: distributedKVStore.KVManagerConfig;
  // 只能包含字母数字或者下划线, 否则会报错
  private storeId: string;
  private kvManager: distributedKVStore.KVManager;
  private kvStorage: distributedKVStore.SingleKVStore;
  private options = {
    createIfMissing: true, // 当数据库文件不存在时是否创建数据库,默认创建
    encrypt: false, // 设置数据库文件是否加密,默认不加密
    backup: false, // 设置数据库文件是否备份,默认备份
    kvStoreType: distributedKVStore.KVStoreType.SINGLE_VERSION, // 设置要创建的数据库类型,默认为多设备协同数据库
    securityLevel: distributedKVStore.SecurityLevel.S2 // 设置数据库安全级别
  };

  constructor(config: distributedKVStore.KVManagerConfig, storeId: string) {
    this.config = config;
    this.storeId = storeId;

    try {
       this.kvManager = distributedKVStore.createKVManager(this.config);
    } catch (e) {
      console.error(`创建 KVManager 失败. Code: ${e.code}, message: ${e.message}`)
    }
  }

  private createKVStore(callback: Homework.Callback<Boolean>) {
      if (this.kvStorage) {
        callback(true);
      } else {
        this.kvManager.getKVStore(this.storeId, this.options, (err, store) => {
          if (err) {
            callback(false);
            return;
          }

          this.kvStorage = store as distributedKVStore.SingleKVStore;
          callback(true);
        });
      }
  }

  getData<T>(key: string): Promise<T> {
    return new Promise((resolve: Function, reject: Function) => {
      this.createKVStore((isSuccess) => {
        if (this.kvStorage) {
          this.kvStorage.get(key).then((value: string) => {
            let json = JSON.parse(value);
            resolve(json);
          }).catch((e) => {
            console.error(`获取 value 失败. Code: ${e.code}, message: ${e.message}`)
            reject(e);
          });
        }
      })
    });
  }

  putData(key: string, value: string): Promise<void> {
    return new Promise((resolve: Function, reject: Function) => {
      this.createKVStore((isSuccess) => {
        if (this.kvStorage) {
          this.kvStorage.put(key, value);
          resolve();
        } else {
          reject(new Error("kvStorage 不存在"));
        }
      });
    });
  }

  closeStore(): Promise<void> {
    if (this.kvManager) {
      return this.kvManager.closeKVStore(this.config.bundleName, this.storeId);
    }

    return new Promise((reject: Function) => {
      reject(new Error("关闭 kvStorage 失败"));
    });
  }

  deleteStore(): Promise<void> {
    if (this.kvManager) {
      return this.kvManager.deleteKVStore(this.config.bundleName, this.storeId);
    }

    return new Promise((reject: Function) => {
      reject(new Error("删除 kvStorage 失败"));
    });
  }
}

问题

使用了模拟器, 模拟器需要设置才会保留数据

解决方法

编辑项目模块的 configrations => 勾选 keep Application data 即可

相关推荐
程序员潘Sir3 小时前
鸿蒙应用开发从入门到实战(六):ArkTS声明式UI和组件化
harmonyos·鸿蒙
猫林老师5 小时前
HarmonyOS数据持久化:Preferences轻量级存储实战
华为·harmonyos
Devil枫9 小时前
鸿蒙深链落地实战:从安全解析到异常兜底的全链路设计
安全·华为·harmonyos
低调小一16 小时前
Android传统开发 vs Android Compose vs HarmonyOS ArkUI 对照表
android·华为·harmonyos
程序员江同学18 小时前
ovCompose + AI 开发跨三端的 Now in Kotlin App
android·kotlin·harmonyos
猛码Memmat19 小时前
华为HarmonyOS开发文档
华为·harmonyos
祥睿夫子20 小时前
ArkTS 未被深挖的核心点:静态多态限制、静态成员与单例实战
harmonyos
高心星1 天前
HarmonyOS 5.0应用开发——V2装饰器@local的使用
harmonyos