• 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 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): 设置数据加密密钥。

    1. import com.tencent.mmkv.MMKV;
    2. public class MMKVExample {
    3. public static void main(String[] args) {
    4. // 初始化MMKV库
    5. MMKV.initialize("/path/to/directory");
    6. // 获取默认的MMKV实例
    7. MMKV mmkv = MMKV.defaultMMKV();
    8. // 存储数据
    9. mmkv.putString("name", "John Doe");
    10. mmkv.putInt("age", 25);
    11. mmkv.putBoolean("isStudent", true);
    12. // 读取数据
    13. String name = mmkv.decodeString("name");
    14. int age = mmkv.decodeInt("age");
    15. boolean isStudent = mmkv.decodeBool("isStudent");
    16. // 输出读取的数据
    17. System.out.println("Name: " + name);
    18. System.out.println("Age: " + age);
    19. System.out.println("Is Student: " + isStudent);
    20. // 删除数据
    21. mmkv.remove("age");
    22. // 检查数据是否存在
    23. boolean containsName = mmkv.containsKey("name");
    24. boolean containsAge = mmkv.containsKey("age");
    25. System.out.println("Contains name: " + containsName);
    26. System.out.println("Contains age: " + containsAge);
    27. // 清除所有数据
    28. mmkv.clear();
    29. }
    30. }
    1. import com.tencent.mmkv.MMKV;
    2. public class MMKVExample {
    3. public static void main(String[] args) {
    4. // 初始化MMKV库
    5. MMKV.initialize("/path/to/directory");
    6. // 获取默认的MMKV实例
    7. MMKV mmkv = MMKV.defaultMMKV();
    8. // 检查是否包含指定键的数据
    9. boolean containsKey = mmkv.containsKey("name");
    10. System.out.println("Contains key: " + containsKey);
    11. // 获取所有键的数组
    12. String[] allKeys = mmkv.getAllKeys();
    13. System.out.println("All keys: ");
    14. for (String key : allKeys) {
    15. System.out.println(key);
    16. }
    17. // 同步数据到磁盘
    18. mmkv.synchronize();
    19. // 存储任意类型的数据,包括自定义对象
    20. CustomObject customObject = new CustomObject("John", 25);
    21. mmkv.encode("customObject", customObject);
    22. // 读取任意类型的数据,包括自定义对象
    23. CustomObject decodedObject = mmkv.decodeParcelable("customObject", CustomObject.class);
    24. System.out.println("Decoded object: " + decodedObject);
    25. // 设置日志级别
    26. MMKV.setLogLevel(MMKV.LogLevel.LevelInfo);
    27. // 设置数据加密密钥
    28. byte[] key = "encryptionKey".getBytes();
    29. mmkv.setCryptKey(key);
    30. }
    31. // 自定义对象示例
    32. static class CustomObject {
    33. private String name;
    34. private int age;
    35. public CustomObject(String name, int age) {
    36. this.name = name;
    37. this.age = age;
    38. }
    39. @Override
    40. public String toString() {
    41. return "CustomObject{" +
    42. "name='" + name + '\'' +
    43. ", age=" + age +
    44. '}';
    45. }
    46. }
    47. }

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

    1. 存储原理:

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

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

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

    2. 读取原理:

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

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

    共享数据

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

    在A进程:

    1. // 初始化 MMKV 实例
    2. MMKV.initialize(context);
    3. MMKV mmkv = MMKV.mmkvWithID("shared_data", MMKV.MULTI_PROCESS_MODE);
    4. // 写入初始值
    5. int counterValue = 0;
    6. mmkv.encode("counter", counterValue);
    7. // 递增计数器
    8. counterValue = mmkv.decodeInt("counter", 0);
    9. counterValue++;
    10. mmkv.encode("counter", counterValue);

    在B进程:

    1. // 初始化 MMKV 实例
    2. MMKV.initialize(context);
    3. MMKV mmkv = MMKV.mmkvWithID("shared_data", MMKV.MULTI_PROCESS_MODE);
    4. // 读取计数器值
    5. int counterValue = mmkv.decodeInt("counter", 0);
    6. 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 中读取并反序列化为对象。

    1. // 定义一个自定义对象
    2. public class Person {
    3. private String name;
    4. private int age;
    5. // 省略构造函数、getter 和 setter 方法
    6. @Override
    7. public String toString() {
    8. return "Person{" +
    9. "name='" + name + '\'' +
    10. ", age=" + age +
    11. '}';
    12. }
    13. }
    14. // 序列化对象并存储到 MMKV
    15. Person person = new Person("John", 25);
    16. Gson gson = new Gson();
    17. String json = gson.toJson(person);
    18. mmkv.encode("person", json);
    19. // 从 MMKV 中读取并反序列化对象
    20. String savedJson = mmkv.decodeString("person", null);
    21. Person savedPerson = gson.fromJson(savedJson, Person.class);
    22. 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 对象。

  • 相关阅读:
    Shell gawk编辑器
    SpringBoot-MQTT实现消息的发布订阅
    过滤表filter达式cql相互转化
    WinRAR CVE-2023-40477代码执行漏洞复现
    前端之CSS——网页的皮肤!!
    在 .NET 7上使用 WASM 和 WASI
    生物医药企业全域数据治理实践 | 爱分析研讨会
    算法查找——二分查找
    cmake链接ffmpeg静态库的方法,及报错答解
    从pom文件里面找不到对应的Maven依赖,通过下面的方法完美解决
  • 原文地址:https://blog.csdn.net/four_two_six_/article/details/133908358