关于Android键值对存储的方案选择

关于Android键值对存储的方案选择

我尽量不打错别字,用词准确,不造成阅读障碍。

关于Android键值对方案的选择一般只有三种:MMKV、SharedPreferences、DataStore,其它的我也不知道了。

一、SharedPreferences

优点

  1. 使用简单:Android SDK中自带的键值对存储方式,其不需要添加任何多余的依赖,直接使用即可。
  2. 不丢失数据:因为其在写入数据的时候会做数据备份,所以如果因为停电等不可抗因素导致的数据损坏并不会导致数据丢失。

缺点

  1. 不支持多进程。
  2. 初始化时会卡顿:当数据量很大的时候初始化会卡顿,而且百分百卡顿。另外,这个异常会上传到后台的统计数据里,会影响绩效。
  3. 可能导致卡顿甚至ANR:虽然其支持异步方式保存更改,但是Activity会在启动和销毁的时候等待这些异步任务的完成,这是为了保证数据一致性而做的妥协,这种情况下,异步就变为同步了,属于是低概率事件。

二、DataStore

2020年推出,2021年8月才发布正式版,为了替换SharedPreferences而出。

优点

  1. 不丢失数据:因为其在写入数据的时候会做数据备份,所以如果因为停电等不可抗因素导致的数据损坏并不会导致数据丢失,这点和SharedPreferences一样。
  2. 协程操作:在初始化及其它使用场景下完全不会有卡顿。
  3. 方便的回调写法:出来的比较晚,语法比较新,再加上Kotlind的语法支持,所以写起来比较舒服。
  4. 大数据量读写速度很快,是所有方案中最快的。

缺点

  1. 不支持多进程:新版本已经有支持的代码,现在也许支持了。
  2. 小数据量读写速度不快,甚至没有SharedPreferences快,是所有方案中最慢的。
  3. 需要Kotlin支持:因为是用协程操作的。

三、MMKV

​ Tencent在2018年推出,起初是因为微信部分用户在解析特殊字符的时候会发生崩溃,所以微信想要在显示消息之前将文本保存至磁盘,为了在崩溃之前准确拿到数据,所以要同步保存(异步的话可能数据还没保存完,程序就完蛋了或者数据损坏),但是同步保存容易导致主线程卡顿,尤其是群里有大量消息来临的时候,总结来说就是有高频同步写磁盘的需求。最后微信采用了内存映射的方案,通过mmap内存映射文件(这种方式下,写入内存的数据也会自动写入文件),提供一段可供随时写入的内存块,由操作系统将内存写入文件,速度快且不必担心Crash导致的数据丢失。

优点

  1. 支持多进程。
  2. 不影响绩效:数据丢失异常不会被后台检查到。
  3. 少量及中量数据写入速度很快,是所有方案中最快的。

缺点

  1. 大数据速度慢:因为是自行管理一块独立的内存,所以在内存尺度的伸缩上就是比较受限,导致写入大数据时速度很慢。
  2. 丢数据:因为不备份,如果备份了,那就要写入磁盘,就会导致没有了高频写入的优势,与需求相违背。
  3. 有概率卡顿:初始化的时候会把所有文件都读出来,所以有概率卡顿。

总结

一般情况下,对数据丢失不敏感,数据量也不大的情况下,建议使用MMKV就好,如果对多进程有要求,那只有MMKV或看看DataStore的最新版是否支持。大数据量的话建议DataStore,速度很快,也很稳,或者对数据保存时间没有特别要求的情况下,使用DataStore。基本无要求的情况下,可以使用SharedPreferences,但是谁也不能保证后面会不会数据量增大,再加上卡顿可能的发生,其实不如用DataStore。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android中,有多种文件存储方式可供选择,以下是常见的几种文件存储方式及其原理: 1. SharedPreferences:SharedPreferences是一种轻量级的存储方式,适合用于存储一些简单的键值对数据。SharedPreferences数据存储在应用的私有目录中,只能被当前应用访问。SharedPreferences可以用于存储一些简单的应用配置信息、用户偏好设置等数据。 2. 内部存储:内部存储是指应用的私有目录,可以通过Context.getFilesDir()方法获取。内部存储的文件只能被当前应用访问,其他应用无法访问。内部存储适合用于存储应用私有数据,例如用户数据、缓存文件等。 3. 外部存储:外部存储是指SD卡或其他外部存储设备,可以通过Environment.getExternalStorageDirectory()方法获取。外部存储可以存储一些公共数据,例如应用安装包、图片、音频、视频等。需要注意的是,外部存储可能会被其他应用或用户访问,因此存储敏感数据时需要进行加密等安全处理。 4. SQLite数据库:SQLite是一种轻量级的关系型数据库,适合用于存储结构化数据。SQLite数据库可以存储在内部存储或外部存储中,并且可以通过ContentProvider等方式实现跨应用数据共享。 5. 网络存储Android应用可以通过网络访问远程服务器上的数据,例如通过HTTP协议访问Web服务器上的数据、通过FTP协议访问远程文件等。需要注意的是,网络存储存在网络延迟、带宽限制等问题,因此需要进行合理的数据缓存和优化。 希望这些原理能够帮助你选择合适的文件存储方式,并设计出高效而安全的文件存储方案

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值