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

相关文章

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

使用JavaScript操作本地存储

《使用JavaScript操作本地存储》这篇文章主要为大家详细介绍了JavaScript中操作本地存储的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录本地存储:localStorage 和 sessionStorage基本使用方法1. localStorage

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

什么是 Ubuntu LTS?Ubuntu LTS和普通版本区别对比

《什么是UbuntuLTS?UbuntuLTS和普通版本区别对比》UbuntuLTS是Ubuntu操作系统的一个特殊版本,旨在提供更长时间的支持和稳定性,与常规的Ubuntu版本相比,LTS版... 如果你正打算安装 Ubuntu 系统,可能会被「LTS 版本」和「普通版本」给搞得一头雾水吧?尤其是对于刚入

TP-LINK/水星和hasivo交换机怎么选? 三款网管交换机系统功能对比

《TP-LINK/水星和hasivo交换机怎么选?三款网管交换机系统功能对比》今天选了三款都是”8+1″的2.5G网管交换机,分别是TP-LINK水星和hasivo交换机,该怎么选呢?这些交换机功... TP-LINK、水星和hasivo这三台交换机都是”8+1″的2.5G网管交换机,我手里的China编程has

Java解析JSON的六种方案

《Java解析JSON的六种方案》这篇文章介绍了6种JSON解析方案,包括Jackson、Gson、FastJSON、JsonPath、、手动解析,分别阐述了它们的功能特点、代码示例、高级功能、优缺点... 目录前言1. 使用 Jackson:业界标配功能特点代码示例高级功能优缺点2. 使用 Gson:轻量

Redis KEYS查询大批量数据替代方案

《RedisKEYS查询大批量数据替代方案》在使用Redis时,KEYS命令虽然简单直接,但其全表扫描的特性在处理大规模数据时会导致性能问题,甚至可能阻塞Redis服务,本文将介绍SCAN命令、有序... 目录前言KEYS命令问题背景替代方案1.使用 SCAN 命令2. 使用有序集合(Sorted Set)

MyBatis延迟加载的处理方案

《MyBatis延迟加载的处理方案》MyBatis支持延迟加载(LazyLoading),允许在需要数据时才从数据库加载,而不是在查询结果第一次返回时就立即加载所有数据,延迟加载的核心思想是,将关联对... 目录MyBATis如何处理延迟加载?延迟加载的原理1. 开启延迟加载2. 延迟加载的配置2.1 使用