|
介绍
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);
//获取默认全局实例var mmkv: MMKV = MMKV.defaultMMKV()//根据业务区分的存取实例var mmkv: MMKV = MMKV.mmkvWithID("ID")var mmkv = MMKV.mmkvWithID("ID", MMKV.MULTI_PROCESS_MODE) //多进程同步支持 |
|