鸿蒙开发 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 即可

相关推荐
HarderCoder1 小时前
重学仓颉-3基本数据类型详解:从理论到实践的全面指南
harmonyos
鸿蒙小灰2 小时前
鸿蒙OpenCV移植技术要点
opencv·harmonyos
鸿蒙先行者2 小时前
鸿蒙分布式能力调用失败解决方案及案例
分布式·harmonyos
大雷神11 小时前
鸿蒙中应用闪屏解决方案
华为·harmonyos
奶糖不太甜16 小时前
鸿蒙UI布局不兼容解决方案笔记
harmonyos
小小小小小星16 小时前
鸿蒙开发调试技巧整理
harmonyos
HarderCoder16 小时前
重学仓颉-2基础编程概念详解
harmonyos
RAY_010420 小时前
2024鸿蒙样题需要掌握的知识点
华为·harmonyos
御承扬20 小时前
HarmonyOS NEXT系列之元服务框架ASCF
华为·harmonyos
HarderCoder20 小时前
重学仓颉-1从零开始学习现代编程语言
harmonyos