更新记录
1.0.0(2023-02-24)
优势:
- 内存准备:通过 mmap 内存映射文件,提供一段可供随时写入的内存块,App 只管往里面写数据,由操作系统负责将内存回写到文件,不必担心crash导致数据丢失。
- 数据组织:数据序列化方面我们选用 protobuf 协议,pb 在性能和空间占用上都有不错的表现。
- 写入优化:考虑到主要使用场景是频繁地进行写入更新,我们需要有增量更新的能力。我们考虑将增量 kv 对象序列化后,append 到内存末尾。
- 空间增长:使用 append 实现增量更新带来了一个新的问题,就是不断 append 的话,文件大小会增长得不可控。我们需要在性能和空间上做个折中
- 支持数据加密,多进程共享,匿名内存,效率更高
uni.setStorage(OBJECT)在缓存大数据时在速度效率方面有所欠缺,mmkv正好可以补充这点
平台兼容性
Android | Android CPU类型 | iOS |
---|---|---|
适用版本区间:4.4 - 12.0 | armeabi-v7a:未测试,arm64-v8a:未测试,x86:未测试 | 适用版本区间:9 - 16 |
原生插件通用使用流程:
- 购买插件,选择该插件绑定的项目。
- 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
- 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
- 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
- 开发完毕后正式云打包
付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios
注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择
MMKV本地数据存取,数据缓存
MMKV微信正在使用的轻量级存储框架
功能
- 内存准备:通过 mmap 内存映射文件,提供一段可供随时写入的内存块,App 只管往里面写数据,由操作系统负责将内存回写到文件,不必担心crash导致数据丢失。
- 数据组织:数据序列化方面我们选用 protobuf 协议,pb 在性能和空间占用上都有不错的表现。
- 写入优化:考虑到主要使用场景是频繁地进行写入更新,我们需要有增量更新的能力。我们考虑将增量 kv 对象序列化后,append 到内存末尾。
- 空间增长:使用 append 实现增量更新带来了一个新的问题,就是不断 append 的话,文件大小会增长得不可控。我们需要在性能和空间上做个折中
- 支持数据加密,多进程共享,匿名内存,效率更高
uni.setStorage(OBJECT)在缓存大数据时在速度效率方面有所欠缺,mmkv正好可以补充这点
插件声明
var mmkv = uni.requireNativePlugin("wrs-mmkv");
- 初始化MMKV
以下初始化方式选一种初始化即可
- 默认初始化
mmkv.initMMKV((resp)=>{
console.log("MMKV初始化 rootDir:" + resp.rootDir);
});
- 自定义文件路径
var params = {};
params.rootDir = "/sss/sss/ssss";
mmkv.initMMKVWithRootDir(params, (resp)=>{
console.log("MMKV初始化 rootDir:" + resp.rootDir);
});
- 自定义文件路径和日志级别
var params = {};
params.rootDir = "/sss/sss/ssss";
params.logLevel = 1; // 日志级别 0: debug 1: info 2: warning 3: error 4: none
mmkv.initMMKVWithRootDirAndLogLevel(params, (resp)=>{
console.log("MMKV初始化 rootDir:" + resp.rootDir);
});
- 自定义文件路径、日志级别和组group
var params = {};
params.rootDir = "/sss/sss/ssss";
params.groupDir = "wrs.www.ddd";
params.logLevel = 1; // 日志级别 0: debug 1: info 2: warning 3: error 4: none
mmkv.initMMKVWithRootDirAndLogLevelAndGroupDir(params, (resp)=>{
console.log("MMKV初始化 rootDir:" + resp.rootDir);
});
- 自定义文件路径、日志级别、组group和日志回调
var params = {};
params.rootDir = "/sss/sss/ssss";
params.groupDir = "wrs.www.ddd"; // groupDir参数仅支持iOS
params.logLevel = 1; // 日志级别 0: debug 1: info 2: warning 3: error 4: none
mmkv.initMMKVWithRootDirAndLogLevelAndGroupDirAndCallback(params, (resp)=>{
if(resp.rootDir) {
console.log("MMKV初始化 rootDir:" + resp.rootDir);
} else if(resp.message) {
console.log("MMKKV日志 message:" + resp.message);
}
});
- 字符串string存取
保存
var params = {};
params.key = "name";
params.value = "张三";
// params.mmkv = {}; // mmkv参数说明见下面
mmkv.setString(params, (resp)=>{
if(resp.suc) {
console.log("保存成功");
} else {
console.log("保存失败");
}
});
获取
var params = {};
params.key = "name";
// params.mmkv = {}; // mmkv参数说明见下面
mmkv.getString(params, (resp)=>{
if(resp.value) {
console.log("value:" + resp.value);
} else {
console.log("没有获取到value");
}
});
mmkv参数说明
适用于所有保存获取数据里参数params下的mmkv节点参数
var params = {};
params.key = "name";
// params.mmkv = {}; // mmkv参数说明见下面
这里的params.mmkv非必传,不传的时候使用默认的mmkv,mmkv对应的key节点为:ID_CryptKey_RootPath、ID_RootPath、ID_CryptKey、ID_Mode、ID, 根据自己的业务传其中一个节点即可。
var params = {};
params.key = "name";
params.mmkv = {
"ID_CryptKey_RootPath": {
“ID”: “LoginModel”,
"cryptKey": "encrypt_key",
"rootPath": "/asdfa"
},
"ID_RootPath": {
“ID”: “LoginModel”,
"rootPath": "/asdfa"
},
"ID_CryptKey": {
“ID”: “LoginModel”,
"cryptKey": "encrypt_key"
},
"ID_Mode": {
“ID”: “LoginModel”,
"mode": 1
},
"ID": {
“ID”: “LoginModel”
}
};
参数说明:
-
ID: 如果不同业务需要区别存储,也可以单独创建自己的实例,可以传ID用于区分不同业务,如LoginModule、RegisterModule
-
cryptKey: MMKV 默认明文存储所有 key-value,依赖 Android 系统的沙盒机制保证文件加密。如果你担心信息泄露,你可以选择加密MMKV,如果需要加密则传cryptKey为加密key
-
rootPath: MMKV 的根目录
-
mode: 模式,1: 单进程 2: 多进程
-
布尔值bool存取
保存
var params = {};
params.key = "name";
params.value = true;
// params.mmkv = {}; // 参考mmkv参数说明
mmkv.setBool(params, (resp)=>{
if(resp.suc) {
console.log("保存成功");
} else {
console.log("保存失败");
}
});
获取
var params = {};
params.key = "name";
// params.mmkv = {}; //参考mmkv参数说明
mmkv.getBool(params, (resp)=>{
if(resp.value) {
console.log("value:" + resp.value);
} else {
console.log("没有获取到value");
}
});
- 整型Int存取
保存
var params = {};
params.key = "name";
params.value = true;
// params.mmkv = {}; // 参考mmkv参数说明
mmkv.setInt(params, (resp)=>{
if(resp.suc) {
console.log("保存成功");
} else {
console.log("保存失败");
}
});
获取
var params = {};
params.key = "name";
// params.mmkv = {}; //参考mmkv参数说明
mmkv.getInt(params, (resp)=>{
if(resp.value) {
console.log("value:" + resp.value);
} else {
console.log("没有获取到value");
}
});
- flost存取
保存
var params = {};
params.key = "name";
params.value = true;
// params.mmkv = {}; // 参考mmkv参数说明
mmkv.setFloat(params, (resp)=>{
if(resp.suc) {
console.log("保存成功");
} else {
console.log("保存失败");
}
});
获取
var params = {};
params.key = "name";
// params.mmkv = {}; //参考mmkv参数说明
mmkv.getFloatparams, (resp)=>{
if(resp.value) {
console.log("value:" + resp.value);
} else {
console.log("没有获取到value");
}
});
- Double存取
保存
var params = {};
params.key = "name";
params.value = true;
// params.mmkv = {}; // 参考mmkv参数说明
mmkv.setDouble(params, (resp)=>{
if(resp.suc) {
console.log("保存成功");
} else {
console.log("保存失败");
}
});
获取
var params = {};
params.key = "name";
// params.mmkv = {}; //参考mmkv参数说明
mmkv.getDouble(params, (resp)=>{
if(resp.value) {
console.log("value:" + resp.value);
} else {
console.log("没有获取到value");
}
});
- 删除
var params = {};
params.key = "name";
// params.mmkv = {}; //参考mmkv参数说明
mmkv.removeValue(params, (resp)=>{
});
- 批量删除
var params = {};
params.keys = ["name", "dddd"];
// params.mmkv = {}; //参考mmkv参数说明
mmkv.removeValue(params, (resp)=>{
});
- 删除所有
var params = {};
// params.mmkv = {}; //参考mmkv参数说明
mmkv.clearAll(params, (resp)=>{
});
- 备份
// backup one instance (from customize root path)、restore one instance (to customize root path)
var params = {};
params.ID = "LoginModule";
params.rootPath = "/afasdf/af";
params.toDirectory = "/asdfaf";
mmkv.backupOne(params, (resp)=>{
});
// backup all instances
var params = {};
// params.rootPath = "/afasdf/af";
params.toDirectory = "/asdfaf";
mmkv.backupAll(params, (resp)=>{
});
- 恢复
// restore all instances
var params = {};
// params.rootPath = "/afasdf/af";
params.fromDirectory = "/asdfaf";
mmkv.backupAll(params, (resp)=>{
});
- 设置日志级别
var params = {};
params.logLevel = 1; // 日志级别 0: debug 1: info 2: warning 3: error 4: none
mmkv.setLogLevel(params);
- 开启自动清理,仅支持iOS,一般业务都用不上
var params = {};
params.maxIdleMinutes = 1;
mmkv.enableAutoCleanUp(params);
- 清理内部缓存,仅支持iOS,一般业务都用不上
var params = {};
// params.mmkv = {}; //参考mmkv参数说明
mmkv.close(params);
- 获取basePatch
mmkv.getBasePath((resp)=>{
var basePath = resp.basePath
});
更详细的说明可参考mmkv
支持定制,联系方式 QQ:252797991