代码之家  ›  专栏  ›  技术社区  ›  T D Nguyen

筛选Android JetPack首选项数据存储

  •  0
  • T D Nguyen  · 技术社区  · 4 年前

    假设我有一个 datastore 其中包含一些 booleanPrefrencesKey

    val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")
    

    我想得到它值为的所有密钥 true :

    suspend fun getTrueKeys(): Set<Preferences.Key<*>>? {
         ...
    }
    

    我怎样才能做到这一点?谢谢

    0 回复  |  直到 4 年前
        1
  •  1
  •   rasfarrf5    4 年前

    我能想到的一种可能的方法是,把你所有的钥匙都放在列表中,比如:

      val keys = listOf("key1", "key2")
      context.dataStore.data.map { preferences ->
          val keyWithTrueValue = keys.filter { key ->
            preferences[key]!! == true
          }
    
          // keyWithTrueValue now contains all true value keys
      }
    
        2
  •  0
  •   T D Nguyen    4 年前

    首先,我们创建一个函数来获取所有可用的密钥,并可以修改@rasfarr5的解决方案来过滤这些密钥

    suspend fun getAllKeys(): Set<Preferences.Key<*>>? = context.assetStatusDS.data
        .map {
            it.asMap().keys
        }.firstOrNull()
    
    suspend fun getKeysWith(condition: Boolean): Set<Preferences.Key<*>>? {
        return getAllKeys()?.filter { key ->
            context.assetStatusDS.data.map {
                it[key] == condition
            }.firstOrNull()!!
        }?.toSet()
    }