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

相关文章

C语言中的浮点数存储详解

《C语言中的浮点数存储详解》:本文主要介绍C语言中的浮点数存储详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、首先明确一个概念2、接下来,讲解C语言中浮点型数存储的规则2.1、可以将上述公式分为两部分来看2.2、问:十进制小数0.5该如何存储?2.3 浮点

Golang中拼接字符串的6种方式性能对比

《Golang中拼接字符串的6种方式性能对比》golang的string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去,主要有6种拼接方式,下面小编就来为大家详细讲讲吧... 目录拼接方式介绍性能对比测试代码测试结果源码分析golang的string类型是不可修改的,对于拼接字

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的

MySQL常见的存储引擎和区别说明

《MySQL常见的存储引擎和区别说明》MySQL支持多种存储引擎,如InnoDB、MyISAM、MEMORY、Archive、CSV和Blackhole,每种引擎有其特点和适用场景,选择存储引擎时需根... 目录mysql常见的存储引擎和区别说明1. InnoDB2. MyISAM3. MEMORY4. A

基于Canvas的Html5多时区动态时钟实战代码

《基于Canvas的Html5多时区动态时钟实战代码》:本文主要介绍了如何使用Canvas在HTML5上实现一个多时区动态时钟的web展示,通过Canvas的API,可以绘制出6个不同城市的时钟,并且这些时钟可以动态转动,每个时钟上都会标注出对应的24小时制时间,详细内容请阅读本文,希望能对你有所帮助...

Java嵌套for循环优化方案分享

《Java嵌套for循环优化方案分享》介绍了Java中嵌套for循环的优化方法,包括减少循环次数、合并循环、使用更高效的数据结构、并行处理、预处理和缓存、算法优化、尽量减少对象创建以及本地变量优化,通... 目录Java 嵌套 for 循环优化方案1. 减少循环次数2. 合并循环3. 使用更高效的数据结构4

Spring AI与DeepSeek实战一之快速打造智能对话应用

《SpringAI与DeepSeek实战一之快速打造智能对话应用》本文详细介绍了如何通过SpringAI框架集成DeepSeek大模型,实现普通对话和流式对话功能,步骤包括申请API-KEY、项目搭... 目录一、概述二、申请DeepSeek的API-KEY三、项目搭建3.1. 开发环境要求3.2. mav

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性

Vue中动态权限到按钮的完整实现方案详解

《Vue中动态权限到按钮的完整实现方案详解》这篇文章主要为大家详细介绍了Vue如何在现有方案的基础上加入对路由的增、删、改、查权限控制,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、数据库设计扩展1.1 修改路由表(routes)1.2 修改角色与路由权限表(role_routes)二、后端接口设计