MMKV-轻量级高效存储数据库
2021-07-02 本文已影响0人
千夜零一
介绍
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];
}
};
}