问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

MMKV存储数组,你用对了吗?

创作时间:
作者:
@小白创作中心

MMKV存储数组,你用对了吗?

引用
CSDN
9
来源
1.
https://blog.csdn.net/qq_36961698/article/details/121459848
2.
https://blog.csdn.net/weixin_43841938/article/details/117652980
3.
https://juejin.cn/post/6989980593366761479
4.
https://www.oschina.net/news/100210/tecent-opensource-mmkv
5.
https://www.cnblogs.com/awkflf11/p/12571664.html
6.
https://developer.aliyun.com/article/1051108
7.
https://juejin.cn/post/7230649998870396983
8.
https://juejin.cn/post/7125306965252636703
9.
https://juejin.cn/post/7408021285769527305

在Android开发中,数据存储是一个常见的需求。MMKV作为腾讯开源的高性能key-value存储组件,因其优秀的性能和便捷的使用方式,越来越多地被开发者所青睐。本文将详细介绍如何使用MMKV来存储和读取数组数据。

为什么选择MMKV?

MMKV(Mmaped Memory KV)是腾讯开源的一款基于内存映射文件的key-value存储引擎。相比传统的SharedPreferences,MMKV具有以下优势:

  1. 性能优越:MMKV使用内存映射文件(mmap)技术,避免了频繁的磁盘I/O操作,读写速度大幅提升。根据官方测试数据,在单进程和多进程场景下,MMKV的性能都远超SharedPreferences和SQLite。

  2. 多进程支持:MMKV提供了高效的多进程数据共享能力,而SharedPreferences在多进程环境下的表现往往不尽如人意。

  3. 数据加密:MMKV支持数据加密,使用AES CFB-128算法,可以更好地保护敏感数据。

  4. 匿名内存支持:对于一些敏感数据,如密码等,MMKV提供了基于Ashmem的匿名共享内存功能,数据不会落地到文件,安全性更高。

  5. 易于迁移:MMKV提供了从SharedPreferences迁移的工具,可以轻松完成数据迁移。

存储数组的两种方法

虽然MMKV本身不直接支持数组存储,但通过一些转换方法,我们可以轻松实现数组的存储和读取。以下是两种常见的方法:

方法一:使用Gson进行序列化

对于复杂的数据类型,如数组或List,最简单的方式是将其转换为JSON字符串,然后存储到MMKV中。这里我们使用Gson库来完成序列化和反序列化工作。

存储数组:

List<String> list = new ArrayList<>();
// ...填充数据...
Gson gson = new Gson();
String jsonString = gson.toJson(list);
MMKV.defaultMMKV().encode("key", jsonString);

读取数组:

Gson gson = new Gson();
Type type = new TypeToken<List<String>>(){}.getType();
List<String> list = gson.fromJson(MMKV.defaultMMKV().decodeString("key"), type);

这种方法的优点是简单易用,特别适合复杂数据结构的存储。但缺点是需要额外引入Gson库,增加了项目的依赖。

方法二:直接操作键值对

如果数组元素是基本数据类型,可以通过遍历数组并逐个存储到MMKV中。这种方法不需要额外的库,但代码量稍多。

存储数组:

public static <T> Boolean setArray(Context context, List<T> list, String name) {
    MMKV kv = MMKV.defaultMMKV();
    if (list == null || list.isEmpty()) {
        kv.putInt(name + "size", 0);
    } else {
        kv.putInt(name + "size", list.size());
        for (int i = 0; i < list.size(); i++) {
            kv.putString(name + i, new Gson().toJson(list.get(i)));
        }
    }
    return kv.commit();
}

读取数组:

public static <T> ArrayList<T> getArray(Context context, String name, Class<T> clazz) {
    MMKV kv = MMKV.defaultMMKV();
    ArrayList<T> list = new ArrayList<>();
    int size = kv.getInt(name + "size", 0);
    for (int i = 0; i < size; i++) {
        String json = kv.getString(name + i, null);
        if (json != null) {
            list.add(new Gson().fromJson(json, clazz));
        }
    }
    return list;
}

这种方法的优点是不依赖额外的库,但需要自己处理数据的序列化和反序列化,代码量相对较多。

使用建议

  • 对于简单数据类型(如int、String等)的数组,可以直接使用键值对的方式存储,效率较高。
  • 对于复杂数据类型(如自定义对象数组),建议使用Gson等工具进行序列化,可以简化代码,减少出错的可能性。
  • 如果项目中已经在使用Gson或其他序列化库,推荐使用第一种方法,因为代码更简洁,易于维护。

注意事项

  1. 实体类需要实现Serializable接口:如果存储的是自定义对象数组,确保实体类实现了Serializable接口,以便支持序列化。

  2. 数据一致性:在多线程环境下使用MMKV时,需要注意数据的一致性问题。虽然MMKV本身是线程安全的,但在某些极端情况下(如进程被kill),可能会出现数据不一致的情况。

  3. 内存使用:虽然MMKV的性能很好,但也要注意不要存储过大的数据,以免占用过多内存。

  4. 加密:如果存储的是敏感数据,建议开启MMKV的加密功能,以保护数据安全。

通过以上方法,我们可以很方便地在Android应用中使用MMKV来存储和读取数组数据。MMKV的高性能和多进程支持特性,使其成为SharedPreferences的理想替代品。希望本文能帮助开发者更好地理解和使用这一强大的存储工具。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号