过滤 Android JetPack 首选项数据存储

问题描述 投票:0回答:3

假设我有一个

datastore
包含一些
booleanPrefrencesKey

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

我想获取其值为的所有键

true
:

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

我怎样才能实现这一目标?谢谢

android filter android-jetpack-datastore
3个回答
1
投票

我能想到的一种可能的方法是将所有密钥保留在列表中,例如:

  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
  }

0
投票

首先我们创建一个函数来获取所有可用的键,并可以修改@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()
}

0
投票

我遇到了类似的问题。这是我最终实现的:

suspend fun getTrueKeys() : Set<Preferences.Key<*>>? {
    var keys = context.dataStore.data.map {
            preferences ->
        preferences.asMap().filter {
            it.value == true
        }.keys
    }.first()

    return keys
}

希望它可以帮助其他面临这个问题的人!

© www.soinside.com 2019 - 2023. All rights reserved.