MMKV-轻量级高效存储数据库

时间:2021-7-3 作者:qvyue

介绍

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(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 CREATOR = new Parcelable.Creator() {
        @Override
        public Stu createFromParcel(Parcel source) {
            return new Stu(source);
        }

        @Override
        public Stu[] newArray(int size) {
            return new Stu[size];
        }
    };
}
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。