本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点
在 Android 开发中,键值对存储(Key-Value Storage)是一种经常用到的轻量级数据存储方案。它主要用于保存一些简单的配置数据或状态信息,例如用户设置、缓存数据等。
常见的键值对存储方案
1、 SharedPreferences:
- 一个轻量级的持久化存储类, 使用键值对的形式保存数据。
- 可以存储的数据类型包括
String
、int
、boolean
、float
和long
。 - 简单易用,但在高并发写操作下性能较差,会造成主线程阻塞问题。
2、 MMKV(微信开源):
- 使用 mmap 内存映射文件,极大提高了读写性能。
- 支持
多进程
读写。 - 完全替代 SharedPreferences,有一致的 API 使用体验。
- 提供分布式存储、数据加密等功能。
3、 DataStore:
- Google 提供的现代化数据存储解决方案。
- 分为
Preferences DataStore
和Proto 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 使用示例
-
依赖配置:
implementation 'com.tencent:mmkv-static:1.2.10'
-
初始化和使用:
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 使用示例
-
依赖配置:
implementation "androidx.datastore:datastore-preferences:1.0.0"
-
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查看更多精彩文章!
标签:存储,preferences,MMKV,vs,SharedPreferences,DataStore,String From: https://blog.csdn.net/myth13141314/article/details/141649635