初始化和实例获取:
MMKV.initialize(Context context): 初始化MMKV库。通常在应用程序的入口点调用此方法。
MMKV.defaultMMKV(): 获取默认的MMKV实例。默认实例使用默认的存储路径和加密方式。
MMKV.mmkvWithID(String mmapID): 根据给定的ID获取MMKV实例。可以使用不同的ID创建多个MMKV实例,每个实例都有独立的数据存储。
存储数据:
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接口的自定义对象数据。
读取数据:
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
删除数据:
remove(String key): 删除指定键的数据。
removeValues(String[] keys): 删除指定键数组的数据。
清除数据:
clear(): 清除所有数据。
其他操作:
contains(String key): 检查是否包含指定键的数据。
getAllKeys(): 获取所有键的数组。
synchronize(): 同步数据到磁盘。
高级功能:
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;
- }
-
- @Override
- public String toString() {
- return "CustomObject{" +
- "name='" + name + '\'' +
- ", age=" + age +
- '}';
- }
- }
- }
存储原理:
MMKV使用mmap(内存映射文件)技术将数据存储在文件中。在初始化MMKV时,它会创建一个特定的文件,并将其映射到进程的地址空间中的一个字节数组。
写入数据时,MMKV会将数据直接写入内存中的字节数组,而不是频繁地写入磁盘文件。这样可以避免磁盘IO的开销,提高了写入性能。
MMKV使用了Copy-on-Write(写时复制)技术,即在写入数据时,会先将要修改的数据复制到新的内存区域,然后进行修改。这样可以避免对原始数据的破坏,同时减少了数据复制的开销。
读取原理:
读取数据时,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 方法
-
- @Override
- public 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 对象。