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

简介: 本文介绍了 Android 开发中常用的键值对存储方案,包括 SharedPreferences、MMKV 和 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.MMKV
    
    class 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.map
    
    private 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查看更多精彩文章!

目录
相关文章
|
14天前
|
Android开发 开发者 Kotlin
Android实战经验之Kotlin中快速实现MVI架构
MVI架构通过单向数据流和不可变状态,提供了一种清晰、可预测的状态管理方式。在Kotlin中实现MVI架构,不仅提高了代码的可维护性和可测试性,还能更好地应对复杂的UI交互和状态管理。通过本文的介绍,希望开发者能够掌握MVI架构的核心思想,并在实际项目中灵活应用。
39 8
|
4月前
|
安全 Android开发 iOS开发
Android vs iOS:深入剖析两大移动操作系统的优劣与未来趋势####
【10月更文挑战第21天】 本文旨在通过技术视角,全面对比分析Android与iOS两大主流移动操作系统的架构差异、用户体验、安全性及生态系统等方面,探讨其各自优势与不足,并预测未来发展趋势。 ####
194 1
|
4月前
|
搜索推荐 Android开发 iOS开发
Android vs iOS:探索移动操作系统的双峰对决###
【10月更文挑战第25天】 本文深入剖析了Android与iOS这两大主流移动操作系统,从它们的哲学起源、核心特性、用户体验到市场表现进行了全面对比。旨在帮助读者理解两者的差异与优势,为选择或开发应用提供有价值的参考。 ###
51 0
|
4月前
|
搜索推荐 Android开发 iOS开发
安卓vs. iOS:操作系统的终极对决####
本文探讨了安卓和iOS两种主流移动操作系统的特点,从用户体验、系统生态、硬件兼容性等维度进行对比分析。通过深入浅出的方式,揭示了两者在技术层面的优劣及未来发展趋势,旨在帮助用户更好地理解并选择适合自己的平台。 ####
|
4月前
|
安全 搜索推荐 Android开发
Android vs. iOS:解锁智能手机操作系统的奥秘####
【10月更文挑战第21天】 在当今这个数字化时代,智能手机已成为我们生活中不可或缺的伙伴。本文旨在深入浅出地探讨两大主流操作系统——Android与iOS的核心差异、优势及未来趋势,帮助读者更好地理解这两个平台背后的技术哲学和用户体验设计。通过对比分析,揭示它们如何塑造了我们的数字生活方式,并展望未来可能的发展路径。无论您是技术爱好者还是普通用户,这篇文章都将带您走进一个充满创新与可能性的移动世界。 ####
165 3
|
4月前
|
安全 搜索推荐 Android开发
Android vs. iOS:一场永无止境的较量####
在智能手机操作系统领域,Android与iOS犹如两极,各自引领着不同的技术潮流和用户体验哲学。本文深入探讨了这两个平台的发展历程、核心优势、以及它们如何塑造了我们的数字生活,旨在为读者提供一个全面而客观的视角,理解这场持续多年的“战争”背后的真正意义。 ####
|
5月前
|
安全 Android开发 iOS开发
Android vs iOS:探索移动操作系统的设计与功能差异###
【10月更文挑战第20天】 本文深入分析了Android和iOS两个主流移动操作系统在设计哲学、用户体验、技术架构等方面的显著差异。通过对比,揭示了这两种系统各自的独特优势与局限性,并探讨了它们如何塑造了我们的数字生活方式。无论你是开发者还是普通用户,理解这些差异都有助于更好地选择和使用你的移动设备。 ###
104 3
|
5月前
|
搜索推荐 vr&ar Android开发
Android vs. iOS:一场永无止境的辩论#### 一、
在当今的智能手机市场,Android和iOS无疑是两大巨头,它们各有千秋,吸引了全球数十亿用户。本文将深入探讨这两个操作系统的核心差异、优势以及未来发展趋势,帮助读者更全面地理解这场科技界的“双雄争霸”。 #### 二、
|
5月前
|
安全 Android开发 数据安全/隐私保护
Android vs. iOS:移动操作系统的巅峰对决###
【10月更文挑战第18天】 本文深入探讨了Android与iOS两大移动操作系统的核心差异、优势与不足,从用户体验、应用生态、系统更新与安全性等多个维度进行了全面对比。我们旨在揭示两大平台背后的设计理念,帮助用户根据自身需求做出更明智的选择。Android以其开放性和高度可定制性著称,为开发者和用户提供了广阔的创新空间;而iOS则凭借其封闭的生态系统和严格的质量控制,提供了流畅且一致的用户体验。两大系统各有千秋,竞争与共生中推动着移动通信技术的不断进步。 ###
|
5月前
|
缓存 前端开发 Android开发
Android实战之如何截取Activity或者Fragment的内容?
本文首发于公众号“AntDream”,介绍了如何在Android中截取Activity或Fragment的屏幕内容并保存为图片。包括截取整个Activity、特定控件或区域的方法,以及处理包含RecyclerView的复杂情况。
45 3

热门文章

最新文章

  • 1
    Android历史版本与APK文件结构
  • 2
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 3
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 4
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 5
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
  • 6
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 7
    【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
  • 8
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
  • 9
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
  • 10
    Android实战经验之Kotlin中快速实现MVI架构
  • 1
    【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
    55
  • 2
    android FragmentManager 删除所有Fragment 重建
    25
  • 3
    Android实战经验之Kotlin中快速实现MVI架构
    39
  • 4
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
    40
  • 5
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
    43
  • 6
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    151
  • 7
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    50
  • 8
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    66
  • 9
    Android历史版本与APK文件结构
    169
  • 10
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    54