HarmonyOS 鸿蒙Next 如何从@ohos/mmkv切换到@tencent/mmkv
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
这边利用下面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)
(1)需要保证@tencent/mmkv获取的实例位置与先前存储位置一致
(2)保证Keep Application Data已勾选
更多关于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实例吗?