• android: Preferences DataStore 和 Proto DataStore use guide


    replace SharedPreferences by DataStore with kotlin

    in Datastore Doc, it provide two way to use DataStore,

    user can use kotlin or java language to implement it. But in fact, use java to implement it will be very different.
    Maybe you can use Rxjava to simplify it, but in fact, use Rxjava to implement it is also not easy.
    use kotlin will very simple to implement it? yes. and it’s ONLY ONE WAY to use it by kotlin.

    steps

    1. init DataStore object:
      private val dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")
      private val switchStateKey = booleanPreferencesKey("toggle")
      
      • 1
      • 2
    2. get value from defined key:
          dataStore.data.map {
              it[switchStateKey] ?: false
          }.asLiveData().observe(this) {
              Log.d(TAG, "getToggleSwitchState: $it")
              binding.preferenceSwitch.isChecked = it
          }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    3. set value to defined key:
      isChecked = !isChecked
      lifecycleScope.launch {
          val key = switchStateKey
          dataStore.edit { preferences ->
              preferences[key] = isChecked
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

    it’s all of use DataStore replace SharedPreferences.

    use Proto DataStore

    steps:

    1. define xx.proto file (path: [module]/src/main/proto/xxx.proto)
      syntax = "proto3";
      
      option java_package = "com.example.application";
      option java_multiple_files = true;
      
      message ProtoCounter {
         int32 example_counter = 1;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    2. define proto datastore struct
      object SettingsSerializer : Serializer<ProtoCounter> {
         override val defaultValue: ProtoCounter = ProtoCounter.getDefaultInstance()
      
          override suspend fun readFrom(input: InputStream): ProtoCounter {
              try {
                  return ProtoCounter.parseFrom(input)
              } catch (exception: InvalidProtocolBufferException) {
                  throw CorruptionException("Cannot read proto.", exception)
              }
          }
         
          override suspend fun writeTo(
              t: ProtoCounter,
              output: OutputStream
          ) = t.writeTo(output)
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
    3. init proto datastore object
         val Context.settingsDataStore: DataStore<ProtoCounter> by dataStore(
              fileName = "settings.pb",
              serializer = SettingsSerializer
         )
      
      • 1
      • 2
      • 3
      • 4
    4. set value to proto datastore
           binding.protoCounter.setOnClickListener {
               lifecycleScope.launch {
                   settingsDataStore.updateData { currentSettings ->
                       currentSettings.toBuilder()
                           .setExampleCounter(currentSettings.exampleCounter + 1)
                           .build()
                   }
               }
           }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
    5. get value from proto datastore
           settingsDataStore.data
               .map { settings ->
                   // The exampleCounter property is generated from the proto schema.
                   settings.exampleCounter
               }.asLiveData().observe(this) {
                   it?.let {
                       binding.protoCounter.text = getString(R.string.proto_counter_text, it)
                   }
               }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9

    it’s all of use Proto DataStore.

    can not use a chinese input method, so …

  • 相关阅读:
    基于Rust语言,和WebAssembly技术,与JavaScript结合,的具体应用场景
    TSN标准化与虹科组网测试方案:赋能多领域以太网新发展
    计算机毕业设计Java旅游官网(源码+mysql数据库+系统+lw文档)
    Java synchronized锁 String 和 Integer 会有什么问题?
    LLMs: 近端策略优化PPO Proximal policy optimization
    vue基于web的化妆品美妆商城电子商务python flask django
    基于elasticjob的入门maven项目搭建
    PySpark数据分析基础:pyspark.sql.SparkSession类方法详解及操作+代码展示
    MR小区搜索(六)cell reselection
    AXera-pi使用使用记录(1)
  • 原文地址:https://blog.csdn.net/DucklikeJAVA/article/details/126304897