Androidx的DataStore顾名思义也是为了存储数据使用的。但是大家可能会疑惑存储数据的话数据库和SharedPreferencet就够了吗,为什么又要使用一个新的存储方式呢?DataStore其实是google官方为了取代ShredPreference,SharedPreference有一些不可修复的缺陷,下面具体看看google官方给的对比图:
- SharedPreference虽然可以异步读写但是它还是会block UI线程
- SharedPrefercence不能捕获异常,例如在读写过程出现IO的异常无法进行不过,所以也就很难确认问题
- SharedPreference是类型不安全的。
- SharedPreference在多线程的情况下还存在数据一致性的问题,即SharedPreference不是线程安全的,但是dataStore使用原子操作,所以它是线程安全的。
- SharedPreference不支持数据合并,如果需要合并老的数据,需要自己手动一个一个的迁移。
- Preference DataStore和 Proto DataStore都属于DataStore,但是Preferences DataStore主要用于存储简单类型,Proto DataStore用于存储复杂类型。
另外一点就是DataStore结合了kotlin的corotinue和flow,对实现数据的异步以及监听变得更加的容易和方便。
Preference DataStore是使用键值对的方式存储,Proto DataStroe存储的是对象,用于存储复杂的对象。需要注意的是在是使用DataStore的时候一定要去捕获它的异常,要不然要是出现问题都很难找。