找回密码
 立即注册
查看: 266|回复: 0

MMKV使用

[复制链接]
发表于 2022-5-1 16:23 | 显示全部楼层 |阅读模式
介绍


MMKV 是腾讯旗下开发的一款存储组件,采用 key - value方式存储,存储数据种类比较多,读写效率高。
一款比sharepreferences稍重,远远小于数据库量级,但性能卓越的存储框架。
必答:mmap+protobuf
特性

    非常高效。MMKV使用mmap与文件保持内存同步,使用protobuf对数值进行编码/解码,充分利用Android,实现最佳性能。多进程并发:MMKV支持进程之间的并发读写访问。
  • 易于使用的。你可以随时使用MMKV。所有的更改都会立即保存,不需要同步,也不需要apply调用。
    小。少数几个文件:MMKV包含进程锁、编码/解码帮助程序和mmap逻辑等等。很整洁。
    大约60K的二进制大小:MMKV在每个架构上增加了大约60K的应用程序大小,而压缩(apk)时增加的就少多了。
对比


单线程还是多线程,MMKV的读写能力都远远的甩开了SharedPreferences&SQLite&SQLite+Transacion

文件读写限制了SharePrefernces的速度,对此,它提供了apply()异步提交,在用户无感知情况下在子线程提交数据。

SharedPreferences是对于单进程而言的单独实例,数据的备份全部在单个进程完成,所以在进行多进程读写时,发生错误是大概率的。
用法


1、添加依赖库
implementation 'com.tencent:mmkv-static:1.0.23'
2、Application中进行初始化
MMKV.initialize(this)
3、具体使用
val mmkvTV = findViewById<TextView>(R.id.mmkvTV)        mmkvTV.setOnClickListener {            //获得默认存储对象            val mmkv = MMKV.defaultMMKV()            //以k-v形式存值            mmkv.encode("a",false)            mmkv.encode("b","sss")            mmkv.encode("c",0.99)            val stu = Stu().apply {                this.id = "001"                this.name = "Jacke"            }            mmkv.encode("d",stu)            //通过encode存,decode取            val test1 = mmkv.decodeBool("a")            val test2 = mmkv.decodeString("b")            val test3 = mmkv.decodeDouble("c")            val test4 = mmkv.decodeParcelable("d",Stu::class.java)  //序列化插件只能操作java类,not kotlin            //打印取出结果集            println("mmkv=>>$test1")            println("mmkv=>>$test2")            println("mmkv=>>$test3")            println("mmkv=>>${test4.id+test4.name}")//            I/System.out: mmkv=>>false//            I/System.out: mmkv=>>sss//            I/System.out: mmkv=>>0.99//            I/System.out: mmkv=>>001Jacke        }
序列化对象类:可以通过AS插件快速生成
/** * @data on 2021/7/2 11:04 上午 * @auther * @describe 序列化对象 */public class Stu implements Parcelable {    public String id = "";    public String name = "";    @Override    public int describeContents() {        return 0;    }    @Override    public void writeToParcel(Parcel dest, int flags) {        dest.writeString(this.id);        dest.writeString(this.name);    }    public void readFromParcel(Parcel source) {        this.id = source.readString();        this.name = source.readString();    }    public Stu() {    }    protected Stu(Parcel in) {        this.id = in.readString();        this.name = in.readString();    }    public static final Parcelable.Creator<Stu> CREATOR = new Parcelable.Creator<Stu>() {        @Override        public Stu createFromParcel(Parcel source) {            return new Stu(source);        }        @Override        public Stu[] newArray(int size) {            return new Stu[size];        }    };}2.设置

    或者设置自定义路径:
String dir = getFilesDir().getAbsolutePath() + "/mmkv";String rootDir = MMKV.initialize(dir);
    获取MMVK实例:
//获取默认全局实例var mmkv: MMKV = MMKV.defaultMMKV()//根据业务区分的存取实例var mmkv: MMKV = MMKV.mmkvWithID("ID")var mmkv = MMKV.mmkvWithID("ID", MMKV.MULTI_PROCESS_MODE)  //多进程同步支持
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2025-5-3 17:15 , Processed in 0.132922 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表