请选择 进入手机版 | 继续访问电脑版

Jetpack -- DataStore

[复制链接]
甜蜜的负担 发表于 2021-1-2 17:44:02 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
DataStore简介



  • Jetpack DataStore 是用来替代SharedPreferences的一种数据存储的管理方案,可以使用Kotlin协程和Flow异步,体现数据处理处罚的一致性。
  • 注意:

    • DataStrore适用于key-value型的数据存储,Room适用于大型大概复杂的数据存储

DataStore使用



  • DataStore : key-value存储和访问数据,不包管范例安全
  • Proto DataStore : 使用Protocol-Buffers存储键值对或范例化对象,包管范例安全
导入依赖

  1. dependencies {  // Typed DataStore (Typed API surface, such as Proto)  implementation "androidx.datastore:datastore:1.0.0-alpha04"  // Alternatively - use the following artifact without an Android dependency.  implementation "androidx.datastore:datastore-core:1.0.0-alpha04"  // Preferences DataStore (SharedPreferences like APIs  implementation "androidx.datastore:datastore-preferences:1.0.0-alpha04"  // Alternatively - use the following artifact without an Android dependency.  implementation "androidx.datastore:datastore-preferences-core:1.0.0-alpha04"}
复制代码
创建DataStore



  • 为了方便管理,使用单例的形式 创建DataStore
  1. class BaseApplication : Application() {    companion object  {        lateinit var instance : BaseApplication    }    override fun onCreate() {        super.onCreate()        instance = this    }}// 创建名为settings的DataStoreval dataStore: DataStore[code] = BaseApplication.instance.createDataStore(    name = "settings")
复制代码
使用DataStore

  1. // eg :从DataStore中读取一个Preferences, 注意处理处罚范例安全// 创建一个名为example_counter的键val EXAMPLE_COUNTER = preferencesKey("example_counter")val exampleCounterFlow : Flow = dataStore.data.map {    preference ->    preference[EXAMPLE_COUNTER]?:0}// DataStore会使用内存缓存的方式优化同一数据的二次读取速度,详细的读取方式如下所示:val exampleData = runBlocking {    // 堵塞线程,需要在协程函数内部或suspend函数下运行,仅读取一次最新数据    exampleCounterFlow.first()}lifecycleScope.launch {    // 非阻塞线程制止ANR大概UI jank    dataStore.data.first()    // You should also handle IOExceptions here.}// eg : 数据修改, edit对传入的操纵视为单个事务的修改,满足了数据的一致性和事务性suspend fun setCounter() {    dataStore.edit { settings ->        val currentCounterValue = settings[EXAMPLE_COUNTER] ?: 0        settings[EXAMPLE_COUNTER] = currentCounterValue + 1;    }}
复制代码
使用Proto DataStore



  • 下载ProtoBuffer, 解压后将\bin路径添加情况变量到情况中

    • 注意: Protocol Buffers,是Google公司开发的一种数据形貌语言,类似于XML可以大概将布局化数据序列化,可用于数据存储、通信协议等方面。

  • 创建存储数据设置文件并编译Proto Buffer数据格式

    • 在app/src/main/proto路径下创建test.proto

  1. syntax = "proto3";option java_package = "com.example.application";option java_multiple_files = true;message Settings {  int example_counter = 1;}// 编译proto bufferprotoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/test.proto// 编译完成后生成文件如下SettingsSettingsOrBuilderTest
复制代码

创建Proto DataStore

  1. object SettingsSerializer : Serializer {  override val defaultValue: Settings = Settings.getDefaultInstance()  override fun readFrom(input: InputStream): Settings {    try {      return Settings.parseFrom(input)    } catch (exception: InvalidProtocolBufferException) {      throw CorruptionException("Cannot read proto.", exception)    }  }  override fun writeTo(    t: Settings,    output: OutputStream) = t.writeTo(output)}val settingsDataStore: DataStore = context.createDataStore(  fileName = "settings.pb",  serializer = SettingsSerializer)
复制代码
从Proto DataStore中读取数据

  1. val exampleCounterFlow: Flow = settingsDataStore.data  .map { settings ->    // The exampleCounter property is generated from the proto schema.    settings.exampleCounter  }
复制代码
向Proto DataStore中写入数据

  1. suspend fun incrementCounter() {  settingsDataStore.updateData { currentSettings ->    currentSettings.toBuilder()      .setExampleCounter(currentSettings.exampleCounter + 1)      .build()    }}
复制代码
将项目中的SharedPreferences迁移至DataStore

  1. val dataStore = context.createDataStore(    name = "Settings",    migrations = listOf(SharedPreferencesMigration(context, "{SharedPreferences名称}")))
复制代码
来源:https://blog.csdn.net/qq_39424143/article/details/112067462
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )