MMKV(2)

2023-10-19 05:20
文章标签 mmkv

本文主要是介绍MMKV(2),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • API

  1. 初始化和实例获取:

    • MMKV.initialize(Context context): 初始化MMKV库。通常在应用程序的入口点调用此方法。

    • MMKV.defaultMMKV(): 获取默认的MMKV实例。默认实例使用默认的存储路径和加密方式。

    • MMKV.mmkvWithID(String mmapID): 根据给定的ID获取MMKV实例。可以使用不同的ID创建多个MMKV实例,每个实例都有独立的数据存储。

  2. 存储数据:

    • putBoolean(String key, boolean value): 存储布尔类型的数据。

    • putInt(String key, int value): 存储整数类型的数据。

    • putLong(String key, long value): 存储长整数类型的数据。

    • putFloat(String key, float value): 存储浮点数类型的数据。

    • putDouble(String key, double value): 存储双精度浮点数类型的数据。

    • putString(String key, String value): 存储字符串类型的数据。

    • putBytes(String key, byte[] value): 存储字节数组类型的数据。

    • putParcelable(String key, Parcelable value): 存储实现了Parcelable接口的自定义对象数据。

  3. 读取数据:

    • getBoolean(String key, boolean defaultValue): 读取布尔类型的数据。

    • getInt(String key, int defaultValue): 读取整数类型的数据。

    • getLong(String key, long defaultValue): 读取长整数类型的数据。

    • getFloat(String key, float defaultValue): 读取浮点数类型的数据。

    • getDouble(String key, double defaultValue): 读取双精度浮点数类型的数据。

    • getString(String key, String defaultValue): 读取字符串类型的数据。

    • getBytes(String key): 读取字节数组类型的数据。

    • getParcelable(String key, Class<T> clazz): 读取实现了Parcelable接口的自定义对象数据。

  4. 删除数据:

    • remove(String key): 删除指定键的数据。

    • removeValues(String[] keys): 删除指定键数组的数据。

  5. 清除数据:

    • clear(): 清除所有数据。

  6. 其他操作:

    • contains(String key): 检查是否包含指定键的数据。

    • getAllKeys(): 获取所有键的数组。

    • synchronize(): 同步数据到磁盘。

  7. 高级功能:

    • encode(String key, Object value): 存储任意类型的数据,包括自定义对象。

    • decodeXXX(String key): 读取任意类型的数据,包括自定义对象。

    • setLogLevel(int level): 设置日志级别。

    • setCryptKey(byte[] key): 设置数据加密密钥。

import com.tencent.mmkv.MMKV;public class MMKVExample {public static void main(String[] args) {// 初始化MMKV库MMKV.initialize("/path/to/directory");// 获取默认的MMKV实例MMKV mmkv = MMKV.defaultMMKV();// 存储数据mmkv.putString("name", "John Doe");mmkv.putInt("age", 25);mmkv.putBoolean("isStudent", true);// 读取数据String name = mmkv.decodeString("name");int age = mmkv.decodeInt("age");boolean isStudent = mmkv.decodeBool("isStudent");// 输出读取的数据System.out.println("Name: " + name);System.out.println("Age: " + age);System.out.println("Is Student: " + isStudent);// 删除数据mmkv.remove("age");// 检查数据是否存在boolean containsName = mmkv.containsKey("name");boolean containsAge = mmkv.containsKey("age");System.out.println("Contains name: " + containsName);System.out.println("Contains age: " + containsAge);// 清除所有数据mmkv.clear();}
}
import com.tencent.mmkv.MMKV;public class MMKVExample {public static void main(String[] args) {// 初始化MMKV库MMKV.initialize("/path/to/directory");// 获取默认的MMKV实例MMKV mmkv = MMKV.defaultMMKV();// 检查是否包含指定键的数据boolean containsKey = mmkv.containsKey("name");System.out.println("Contains key: " + containsKey);// 获取所有键的数组String[] allKeys = mmkv.getAllKeys();System.out.println("All keys: ");for (String key : allKeys) {System.out.println(key);}// 同步数据到磁盘mmkv.synchronize();// 存储任意类型的数据,包括自定义对象CustomObject customObject = new CustomObject("John", 25);mmkv.encode("customObject", customObject);// 读取任意类型的数据,包括自定义对象CustomObject decodedObject = mmkv.decodeParcelable("customObject", CustomObject.class);System.out.println("Decoded object: " + decodedObject);// 设置日志级别MMKV.setLogLevel(MMKV.LogLevel.LevelInfo);// 设置数据加密密钥byte[] key = "encryptionKey".getBytes();mmkv.setCryptKey(key);}
// 自定义对象示例static class CustomObject {private String name;private int age;public CustomObject(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "CustomObject{" +"name='" + name + '\'' +", age=" + age +'}';}}
}

存储和读取原理(上文有提及)

  1. 存储原理:

    • MMKV使用mmap(内存映射文件)技术将数据存储在文件中。在初始化MMKV时,它会创建一个特定的文件,并将其映射到进程的地址空间中的一个字节数组。

    • 写入数据时,MMKV会将数据直接写入内存中的字节数组,而不是频繁地写入磁盘文件。这样可以避免磁盘IO的开销,提高了写入性能。

    • MMKV使用了Copy-on-Write(写时复制)技术,即在写入数据时,会先将要修改的数据复制到新的内存区域,然后进行修改。这样可以避免对原始数据的破坏,同时减少了数据复制的开销。

  2. 读取原理:

    • 读取数据时,MMKV会直接从内存中的字节数组中读取数据,而不需要进行磁盘读取操作。这样可以极大地提高读取速度,尤其在频繁读取大量数据的场景下效果显著。

    • 为了快速定位和读取指定键的数据,MMKV使用了索引结构。索引结构可以是哈希表、跳表或B+树等,它们都具有快速查找的特性,可以高效地从内存中的字节数组中定位和获取对应键的数据。

共享数据

两个进程中共享一个计数器

在A进程:

// 初始化 MMKV 实例
MMKV.initialize(context);
MMKV mmkv = MMKV.mmkvWithID("shared_data", MMKV.MULTI_PROCESS_MODE);// 写入初始值
int counterValue = 0;
mmkv.encode("counter", counterValue);// 递增计数器
counterValue = mmkv.decodeInt("counter", 0);
counterValue++;
mmkv.encode("counter", counterValue);

在B进程:

// 初始化 MMKV 实例
MMKV.initialize(context);
MMKV mmkv = MMKV.mmkvWithID("shared_data", MMKV.MULTI_PROCESS_MODE);// 读取计数器值
int counterValue = mmkv.decodeInt("counter", 0);
System.out.println("Counter value in Process B: " + counterValue);

进程 A 和进程 B 都使用相同的进程名 "shared_data" 来初始化 MMKV 实例,并将 MULTI_PROCESS_MODE 模式用于进程共享数据。

在进程 A 中,初始时将计数器的值设置为 0,并将其存储在 MMKV 中。然后,递增计数器的值,并将更新后的值再次存储在 MMKV 中。

在进程 B 中,通过相同的进程名初始化 MMKV 实例,并从 MMKV 中读取计数器的值。由于进程 A 和进程 B 共享相同的 MMKV 实例,进程 B 将能够读取到进程 A 更新后的计数器值。

序列反序列

MMKV 本身并不提供直接的对象序列化功能,但可以使用其他库(如 Gson、Jackson 等)将对象转换为字符串或字节数组进行存储和读取。

下面是一个示例,展示了如何使用 Gson 库将对象序列化为 JSON 字符串,并存储到 MMKV 中,然后再从 MMKV 中读取并反序列化为对象。

// 定义一个自定义对象
public class Person {private String name;private int age;// 省略构造函数、getter 和 setter 方法@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}// 序列化对象并存储到 MMKV
Person person = new Person("John", 25);
Gson gson = new Gson();
String json = gson.toJson(person);
mmkv.encode("person", json);// 从 MMKV 中读取并反序列化对象
String savedJson = mmkv.decodeString("person", null);
Person savedPerson = gson.fromJson(savedJson, Person.class);System.out.println("Saved Person: " + savedPerson);

在上述示例中,定义了一个名为 Person 的自定义对象,并使用 Gson 库将其转换为 JSON 字符串。然后使用 mmkv.encode("person", json) 将 JSON 字符串存储到 MMKV 中。

在读取时,使用 mmkv.decodeString("person", null) 从 MMKV 中获取存储的 JSON 字符串。然后使用 Gson 的 fromJson() 方法将 JSON 字符串反序列化为 Person 对象。

这篇关于MMKV(2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/237562

相关文章

Android经典实战之存储方案对比:SharedPreferences vs MMKV vs DataStore

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 在 Android 开发中,键值对存储(Key-Value Storage)是一种经常用到的轻量级数据存储方案。它主要用于保存一些简单的配置数据或状态信息,例如用户设置、缓存数据等。 常见的键值对存储方案 1、 SharedPreferences: 一个轻量级的持久

Android 常用开源库 MMKV 源码分析与理解

文章目录 前言一、MMKV简介1.mmap2.protobuf 二、MMKV 源码详解1.MMKV初始化2.MMKV对象获取3.文件摘要的映射4.loadFromFile 从文件加载数据5.数据写入6.内存重整7.数据读取8.数据删除9.文件回写10.Protobuf 实现1.序列化2.反序列化 12.文件锁1.加锁2.解锁 13.状态同步 总结参考文献 前言 谈到轻量级的数

android ——MMKV保存bean实体对象、保存数组bean

MMKV简介 MMKV是一款基于 mmap 内存映射的 key-value 存储库,专门为移动端开发设计。相比于传统的SharedPreferences和SQLite等存储方式,MMKV具有更快的读写速度和更小的存储空间占用。同时,MMKV还提供了多线程安全的支持和可配置的加密选项。因此,在移动端开发中,MMKV被广泛应用于数据持久化和缓存优化等方面。 添加依赖 implementat

SharedPreferences垃圾吗?对比MMKV和DataStore经验之谈

SharedPreferences 很垃圾吗? 嗯,他会阻塞主线程。他可能会崩溃,他可能无法提供大内容的存储,性能比较差,ANR等等。 但是是它的错吗?他的设计本意是提供极少的一些变量存储。结果臃肿的代码和封装写法,过度使用导致了很多问题。 如果不想看全篇,看粗体内容看看你是否有共鸣和不了解的地方,查漏补缺。 目前流行的存储有如下几个我这边自行给出个人使用感受: MMKV 通过内存映

Android MMKV 接入+ 替换原生 SP + 原生 SP 数据迁移

背景:项目中一直使用的是原生 SP,众所周知,使用原生 SP 存在卡顿性能问题。公司的性能监控平台抓到不少原生 SP 导致的 ANR 问题: java.io.FileDescriptor.sync (FileDescriptor.java)android.os.FileUtils.sync (FileUtils.java:256)android.app.SharedPreferencesI

MMKV 基于 mmap 的高性能通用 key-value 组件

学前介绍 MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。从 2015 年中至今,在 iOS 微信上使用已有近 3 年,其性能和稳定性经过了时间的验证。 官方MMKV地址 为什么要替代SharedPreferences? 1,数据加密。 在 Android 环境里,数据加密是非常必须的,SP实际上是

SharedPreference进阶MMKV框架

SharedPreference 简介 顾名思义,Android 开发肯定会使用到SharedPreference。以下简称SP sp是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置。 是以xml文件保到:/data/data/包名/shared_prefs目录下。类似键值对的方式来存储数据。 sp提供了常规的数据类型保存接口比如:int、long、boolean、St

ZUI易入门Android之 MMKV

MMKV是什么?      在Android开发过程中,我们经常会使用到一些存储。经常使用sharepreferences存储,当你的数据量在不需要使用数据库,但sharepreferences感觉又无法承载的时候,但性能卓越的存储框架,由腾讯旗下的微信开发—MMKV 今天我们主要从这几个方面来解释一下MMKV MMKV存储优势MMKV存储支持的数据类型MMKV引入依赖MMKV存储与

web前端开发培训心得,MMKV集成与原理

form表单细节 一、表单 1.表单 标签用于为用户输入创建 HTML 表单 2.表单能够包含 input 元素,比如文本字段、复选框、单选框、提交按钮等等。 3.表单还可以包含 menus、textarea、fieldset、legend 和 label 元素。 4.表单用于向服务器传输数据。 二、表单form 的属性 (一)action属性 action

MMKV(3)

使用时遇到的问题 在项目的构建配置文件(如 Gradle 或 Maven)中添加相应的依赖项。 MMKV 是一个键值存储库,它存储的是原始的字节数组数据。需要存储和检索复杂的对象或数据结构,需要自行进行序列化和反序列化操作。可以使用任何合适的序列化库(如 JSON、Protocol Buffers 等)将对象转换为字节数组,并在读取时进行相反的操作。 读取数据时,需要将字节数组转换回相应的数