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

相关推荐
2401_8603195226 分钟前
在React Native鸿蒙跨平台开发中实现一个冒泡排序算法并将其应用于数据排序,如何进行复制数组以避免直接修改状态中的数组
javascript·算法·react native·react.js·harmonyos
ujainu2 小时前
FlutterOHOS开发:从基础到跨端实战
flutter·harmonyos·开发
爱吃大芒果2 小时前
Flutter 基础组件详解:Text、Image、Button 使用技巧
开发语言·javascript·flutter·华为·ecmascript·harmonyos
赵财猫._.3 小时前
React Native鸿蒙开发实战(二):基础组件与Flex布局
react native·react.js·harmonyos
盐焗西兰花5 小时前
鸿蒙学习实战之路-多端交互最佳实践
学习·交互·harmonyos
90后的晨仔6 小时前
鸿蒙开发必备:macOS 上 ohpm 的完整安装与配置指南(从报错到成功)
harmonyos
90后的晨仔7 小时前
安装ohpm报错ERROROR: node: command not found Failed to find the executable 'node'
harmonyos
盐焗西兰花7 小时前
鸿蒙学习实战之路-Web 页面适配最佳实践
前端·学习·harmonyos
90后的晨仔8 小时前
ANDROID_HOME not set. Set the environment variable. Then, close DevEco Studio an
harmonyos
俩毛豆9 小时前
【鸿蒙生态共建】一文讲清耗时操作对定时器的超时事件影响及解决方案-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
华为·harmonyos