更新记录

1.0.0(2023-02-24)

优势:

  1. 内存准备:通过 mmap 内存映射文件,提供一段可供随时写入的内存块,App 只管往里面写数据,由操作系统负责将内存回写到文件,不必担心crash导致数据丢失。
  2. 数据组织:数据序列化方面我们选用 protobuf 协议,pb 在性能和空间占用上都有不错的表现。
  3. 写入优化:考虑到主要使用场景是频繁地进行写入更新,我们需要有增量更新的能力。我们考虑将增量 kv 对象序列化后,append 到内存末尾。
  4. 空间增长:使用 append 实现增量更新带来了一个新的问题,就是不断 append 的话,文件大小会增长得不可控。我们需要在性能和空间上做个折中
  5. 支持数据加密,多进程共享,匿名内存,效率更高

uni.setStorage(OBJECT)在缓存大数据时在速度效率方面有所欠缺,mmkv正好可以补充这点


平台兼容性

Android Android CPU类型 iOS
适用版本区间:4.4 - 12.0 armeabi-v7a:未测试,arm64-v8a:未测试,x86:未测试 适用版本区间:9 - 16

原生插件通用使用流程:

  1. 购买插件,选择该插件绑定的项目。
  2. 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
  3. 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
  4. 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
  5. 开发完毕后正式云打包

付费原生插件目前不支持离线打包。
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微信正在使用的轻量级存储框架

功能

  1. 内存准备:通过 mmap 内存映射文件,提供一段可供随时写入的内存块,App 只管往里面写数据,由操作系统负责将内存回写到文件,不必担心crash导致数据丢失。
  2. 数据组织:数据序列化方面我们选用 protobuf 协议,pb 在性能和空间占用上都有不错的表现。
  3. 写入优化:考虑到主要使用场景是频繁地进行写入更新,我们需要有增量更新的能力。我们考虑将增量 kv 对象序列化后,append 到内存末尾。
  4. 空间增长:使用 append 实现增量更新带来了一个新的问题,就是不断 append 的话,文件大小会增长得不可控。我们需要在性能和空间上做个折中
  5. 支持数据加密,多进程共享,匿名内存,效率更高

uni.setStorage(OBJECT)在缓存大数据时在速度效率方面有所欠缺,mmkv正好可以补充这点

插件声明


var mmkv = uni.requireNativePlugin("wrs-mmkv");
  • 初始化MMKV

以下初始化方式选一种初始化即可

  1. 默认初始化

            mmkv.initMMKV((resp)=>{
                console.log("MMKV初始化 rootDir:" + resp.rootDir);
            });
  1. 自定义文件路径

            var params = {};
            params.rootDir = "/sss/sss/ssss";
            mmkv.initMMKVWithRootDir(params, (resp)=>{
                console.log("MMKV初始化 rootDir:" + resp.rootDir);
            });
  1. 自定义文件路径和日志级别

            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);
            });
  1. 自定义文件路径、日志级别和组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);
            });
  1. 自定义文件路径、日志级别、组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

如果觉得可以就点个👍吧,欢迎粉丝收藏,土豪打赏,您的关注就是我们创作的动力!

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件使用的 MMKV SDK可能会采集数据,详情可参考:https://github.com/Tencent/MMKV

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问