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

本文主要是介绍Android经典实战之存储方案对比:SharedPreferences vs MMKV vs DataStore,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

在 Android 开发中,键值对存储(Key-Value Storage)是一种经常用到的轻量级数据存储方案。它主要用于保存一些简单的配置数据或状态信息,例如用户设置、缓存数据等。

常见的键值对存储方案

1、 SharedPreferences

  • 一个轻量级的持久化存储类, 使用键值对的形式保存数据。
  • 可以存储的数据类型包括 Stringintbooleanfloatlong
  • 简单易用,但在高并发写操作下性能较差,会造成主线程阻塞问题。

2、 MMKV(微信开源):

  • 使用 mmap 内存映射文件,极大提高了读写性能。
  • 支持多进程读写。
  • 完全替代 SharedPreferences,有一致的 API 使用体验。
  • 提供分布式存储、数据加密等功能。

3、 DataStore

  • Google 提供的现代化数据存储解决方案。
  • 分为 Preferences DataStoreProto DataStore 两类,前者也是基于键值对的存储,后者基于 ProtoBuf。
  • 用 Kotlin 协程和 Flow 实现异步、响应式编程。
  • 类型安全、无业务侵入,支持直接保存对象。

MMKV 与 DataStore 对比

性能
  • MMKV:

    • 基于 mmap,直接与内存交互,性能优越。
    • 高效的序列化和反序列化性能。
  • DataStore

    • 采用 protobuf 序列化(Proto DataStore),相比 SharedPreferences 性能更好。
    • 读写性能较高,但由于是异步操作,实时性上稍逊色于 MMKV。
并发处理
  • MMKV

    • 支持多进程访问,不会造成数据竞争问题。
  • DataStore

    • 使用 Kotlin 协程控制多线程,相比 SharedPreferences 更安全且更易管理。
易用性
  • MMKV

    • 提供 API 和 SharedPreferences 相似,容易上手。
    • 支持复杂类型的数据序列化。
  • DataStore

    • 需要理解异步流动的概念以及 Kotlin 协程和 Flow。
    • 类型安全,支持直接保存对象,不过需要定义 ProtoBuf schema。
稳定性
  • MMKV

    • 长时间表现稳定,微信等产品的实践已经验证其可靠性。
  • DataStore

    • 作为 Android Jetpack 新的库,有 Google 官方的持续更新支持。

实际代码示例

MMKV 使用示例
  1. 依赖配置

    implementation 'com.tencent:mmkv-static:1.2.10'
    
  2. 初始化和使用

    import com.tencent.mmkv.MMKVclass MyApplication : Application() {override fun onCreate() {super.onCreate()MMKV.initialize(this)}
    }fun saveData(key: String, value: String) {val kv = MMKV.defaultMMKV()kv.encode(key, value)
    }fun getData(key: String): String? {val kv = MMKV.defaultMMKV()return kv.decodeString(key)
    }
    
DataStore 使用示例
  1. 依赖配置

    implementation "androidx.datastore:datastore-preferences:1.0.0"
    
  2. Preferences DataStore 使用

    import androidx.datastore.preferences.core.*
    import androidx.datastore.preferences.preferencesDataStore
    import kotlinx.coroutines.flow.Flow
    import kotlinx.coroutines.flow.mapprivate val Context.dataStore by preferencesDataStore("settings")object PreferencesKeys {val EXAMPLE_KEY = stringPreferencesKey("example_key")
    }suspend fun saveData(context: Context, value: String) {context.dataStore.edit { preferences ->preferences[PreferencesKeys.EXAMPLE_KEY] = value}
    }fun getData(context: Context): Flow<String?> {return context.dataStore.data.map { preferences ->preferences[PreferencesKeys.EXAMPLE_KEY]}
    }
    

总结

  • SharedPreferences 适合简单、少量的数据存储,使用方便,但在性能和并发上有缺陷。
  • MMKV 性能卓越,支持多进程,API 类似 SharedPreferences,便于迁移和使用,非常适合需要高性能和多进程支持的应用场景。
  • DataStore 是 Google 提供的现代化库,具有良好的异步和响应式编程体验,以及类型安全的存储,比较适合新的项目开发。

根据项目的需求选择合适的键值对存储方案,可以显著提升应用的性能和用户体验。


欢迎关注我的公众号AntDream查看更多精彩文章!

AntDream

这篇关于Android经典实战之存储方案对比:SharedPreferences vs MMKV vs DataStore的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

关于MyISAM和InnoDB对比分析

《关于MyISAM和InnoDB对比分析》:本文主要介绍关于MyISAM和InnoDB对比分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录开篇:从交通规则看存储引擎选择理解存储引擎的基本概念技术原理对比1. 事务支持:ACID的守护者2. 锁机制:并发控制的艺

CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比

《CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比》CSS中的position属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布... css 中的 position 属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布局和层叠关

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

在Java中将XLS转换为XLSX的实现方案

《在Java中将XLS转换为XLSX的实现方案》在本文中,我们将探讨传统ExcelXLS格式与现代XLSX格式的结构差异,并为Java开发者提供转换方案,通过了解底层原理、性能优势及实用工具,您将掌握... 目录为什么升级XLS到XLSX值得投入?实际转换过程解析推荐技术方案对比Apache POI实现编程

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源