HarmonyOS 鸿蒙Next 如何从@ohos/mmkv切换到@tencent/mmkv

发布于 1周前 作者 h691938207 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 如何从@ohos/mmkv切换到@tencent/mmkv

已经上线的App用的是@ohos/mmkv 这个第三方库作为mmkv

现在发现他不支持了,推荐使用@tencent/mmkv的mmkv

如果用户已经使用下载过mmkv,产生过数据,需要读取原有数据进行数据迁移

考虑了几种方案,都不可行,有没有大佬指点一下

1. 直接安装@tencent/mmkv,卸载@ohos/mmkv,发现不能无缝衔接

哪怕是不加密的数据,读取出来的数据也是undefined

2. 那我们考虑将数据从@ohos/mmkv读取出来,然后导入到@tencent/mmkv里面

这样会有几个问题

(1)两个库都是基于libmmkv.so 这个依赖,同时安装两个库,会报错,编译不出来

(2)哪怕有办法处理,同时安装两个so库和两个mmkv库,也是不恰当的吧?

(3)并且同步数据可能要一定的时间

有没有大佬指点一下


更多关于HarmonyOS 鸿蒙Next 如何从@ohos/mmkv切换到@tencent/mmkv的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

这边利用下面demo,使用@ohos/mmkv初始化并创建mmkv实例,写入数据,然后在工程里面卸载@ohos/mmkv,安装@tencent/mmkv,读取相应的实例,可以正常获取之前写入的数据

    let context: common.ApplicationContext = getContext() as common.ApplicationContext;
    this.filePath = context.filesDir as string
    this.cachePath = context.cacheDir as string
    // [@ohos](/user/ohos)/mmkv初始化并创建实例
    // MMKV.initialize(this.filePath, this.cachePath)
    // let kv = MMKV.getMMKVWithMMapID('imported', MMKV.SINGLE_PROCESS_MODE, "", undefined);
    // // 存数据
    // kv.encodeBool('boolData', false)
    // kv.encodeString('stringData', 'dsfsg')
    // // 取数据
    // kv.decodeBool('boolData')
    // let stringData = kv.decodeString('stringData')
    // console.log("stringData is ", stringData)

    // [@tencent](/user/tencent)/mmkv初始化并获取实例
    MMKV.initialize(context)
    let kv = MMKV.mmkvWithID('imported', MMKV.SINGLE_PROCESS_MODE, "", this.filePath)
    // 获取数据
    kv.decodeBool('boolData')
    let stringData = kv.decodeString('stringData')
    console.log("stringData is ", stringData)

image.png

(1)需要保证@tencent/mmkv获取的实例位置与先前存储位置一致

(2)保证Keep Application Data已勾选

image.png

更多关于HarmonyOS 鸿蒙Next 如何从@ohos/mmkv切换到@tencent/mmkv的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


可以试一下[@tencent](/user/tencent)/mmkv的backedUpMMKVWithID,该接口用于获取备份的MMKV实例,可利用该接口来恢复数据,接口的源码介绍如下:

public static backedUpMMKVWithID(mmapID: string, rootPath: string, mode?: number, cryptKey?: string): MMKV {
 if (!MMKV.g_rootDir) {
   throw new Error('You should Call MMKV.initialize() first.')
 }
 let realMode = (mode ?? MMKV.SINGLE_PROCESS_MODE) | MMKV.BACKUP_MODE
 // hilog.info(0x0000, 'mmkv', 'realMode %{public}d for mmapID %{public}s', realMode, mmapID);
 return MMKV.mmkvWithID(mmapID, realMode, cryptKey, rootPath);
}

没有用啊,这里本质上还是调MMKV.mmkvWithID这个方法 读出来数据还是undefined

有提前备份MMKV实例吗?

mmkv 实例没有删除

我的操作是,在自己的demo工程里面,使用@ohos/mmkv 新建一个mmkv示例,并且写入一个string数据 然后在工程里面卸载@ohos/mmkv,但是mmkv的数据库文件还是存在沙盒里面的

然后安装@tencent/mmkv,读取相应的示例,然后读取之前写入的string的数据,读取出来结果为undefined

HarmonyOS 鸿蒙Next 从@ohos/mmkv切换到@tencent/mmkv的步骤如下:

  1. 移除旧依赖: 在你的项目配置文件中(例如package.json或鸿蒙特有的配置文件),找到@ohos/mmkv的依赖项,并将其移除。使用相应的命令或工具来卸载该依赖。

  2. 添加新依赖: 同样在项目配置文件中,添加@tencent/mmkv的依赖项。确保使用正确的版本号和配置。安装新依赖后,确保项目能够正确识别并使用它。

  3. 更新代码: 在代码中,将所有使用@ohos/mmkv的API调用替换为@tencent/mmkv的对应API。这包括初始化、读写数据等所有相关操作。注意API参数的差异,确保替换后的代码逻辑正确。

  4. 重新编译: 完成代码更新后,重新编译你的项目。确保所有改动都被正确加载,并且项目能够顺利运行。

  5. 测试: 运行项目并进行全面的测试,确保从@ohos/mmkv切换到@tencent/mmkv后,所有功能均正常工作,数据读写无误。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部