首页 > 其他分享 >Android经典实战之存储方案对比:SharedPreferences vs MMKV vs DataStore

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

时间:2024-08-29 09:51:35浏览次数:13  
标签:存储 preferences MMKV vs SharedPreferences DataStore String

本文首发于公众号“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查看更多精彩文章!

AntDream

标签:存储,preferences,MMKV,vs,SharedPreferences,DataStore,String
From: https://blog.csdn.net/myth13141314/article/details/141649635

相关文章

  • [1052] Add the ArcPy Python interpreter in VS Code
    ToaddtheArcPyPythoninterpreterinVisualStudioCode(VSCode),followthesesteps:InstallArcGISPro:EnsureyouhaveArcGISProinstalled,asitincludestheArcPylibrary.InstallVSCode:DownloadandinstallVisualStudioCodefromtheoffi......
  • LVS之NAT模式
     LVS之NAT模式实现 原理图:  拓扑图: 环境说明:1、基于DNAT实现lvs,LVS需要开启ip_forward2、lvs和RS之间可以跨路由3、本实验基于虚拟机实验,client与VIP直连,不用配置网关;实际环境client和lvs之间有路由,client需要配置直连路由的为网关4、client端无法ping通RS,client......
  • 网络文件共享之vsftp
    文件传输协议FTP一、概述文件传输协议:FileTransferProtocol 架构:C/S服务端口:21/tcp 20/tcp双通道协议:命令连接和数据连接数据传输格式:二进制(默认)和文本两种模式:从服务器角度主动模式(PORTSTYLE):服务器主动发起数据连接......
  • LVS-DR1
    LVS-DR模式同网段实现说明:DIP、VIP、RIP同网段拓扑:   环境说明:1、client网关指向Router,跨网段访问lvs-VIP,需要指定正确网关和路由,如果client和Route之间还有其他路由或防火墙设备,网关设置直连路由IP2、虚拟机模拟路由器,Router需要开启路由转发ip_forward3、实验......
  • LVS-DR2
     LVS-DR模式不同网段实现说明:DIP与RIP和VIP不同网段 拓扑:   环境说明:1、client网关指向Router,跨网段访问lvs-VIP,需要指定正确网关和路由,如果client和Route之间还有其他路由或防火墙设备,网关设置直连路由IP2、虚拟机模拟路由器,Router需要开启路由转发ip_forward3......
  • keepalived-lvs-DR
    keepalived实现lvs高可用说明:lvs单实例拓扑: 环境说明:1、client网关指向Router,跨网段访问lvs-VIP,需要指定正确网关和路由,如果client和Route之间还有其他路由或防火墙设备,网关设置直连路由IP2、虚拟机模拟路由器,Router需要开启路由转发ip_forward3、实验环境模拟路由器......
  • 《绝地求生大逃杀》游戏启动时闪退弹窗“找不到devshl.dll”该怎么解决?PUBG游戏崩溃提
    在玩《绝地求生大逃杀》时,启动游戏却闪退并弹窗“找不到devshl.dll”,这十分让人头疼。要解决这个问题,可以尝试重新安装相关运行库,或者从可靠渠道获取该文件并正确放置到指定位置,也不排除是系统故障,需进行全面检查。本篇将为大家带来《绝地求生大逃杀》游戏启动时闪退弹窗“找不......
  • Python开发工具:VSCode+插件
    本篇是Python系列教程第3篇,更多内容敬请访问我的Python合集VisualStudioCode的安装非常简单,就不放这里增加文章篇幅了。相比PyCharm,VSCode更加轻量,启动速度快。并且搭配Python插件就能实现和Pycharm一样的代码提示、高亮效果。1安装插件安装插件也非常简单,打开VSCo......
  • 【VMware VCF】VCF 5.2:挂载远程 vSAN 数据存储。
    VMwarevSAN解决方案中,为了充分利用vSANHCI集群内的存储资源,vSANHCI和vSANHCI集群之间可以相互共享存储资源,这种解决方案早期叫vSANHCIMesh,现在被称为具有数据存储共享的vSANHCI(vSANHCIwithdatastoresharing)。VMwarevSAN集群根据主机磁盘的组成方式分为Orig......
  • 适用于多语言的VScode配置教程:同一文件夹内支持C++, JAVA, Python
    前言VScode作为一款强大的文本编辑器,只要配置恰当,便可以同时在一个环境内编译多种语言的文件。本文简要给出一种同时支持C++,Python,Java的配置方式(windows平台)。配置格式1.创建工作区并建立如图的文件夹及文件结构其中包括vscode的配置文件夹.vscode,以及其他三个代码文件......