在我的应用程序中,我有一个多选对话框,其中包含用户应能够选择的各种过滤器选项,以便根据文档的rarity
字段来过滤数据库。由于过滤器对话框中有许多选项,因此,如果我们考虑过滤器的所有可能组合,则手工覆盖每种情况将花费很多时间。考虑到这一点,我尝试创建一个起始查询,如下所示,然后遍历用户选择的过滤器列表,并尝试向每个过滤器的查询添加whereEqualTo("rarity",filter)
操作。我注意到您不能像普通变量那样连接查询var i += 5
,所以我想知道是否有解决此类问题的方法。 您是否可以在 相同查询中以分步/段方式实际应用多个 whereEqualTo
操作 ,而不会覆盖以前在上应用的操作相同的查询?
这是在收到用户在我的FilterActivity.kt类中选择的过滤器后尝试的操作:
class FilterActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_filter)
val db = FirebaseFirestore.getInstance()
val filters:ArrayList<String>? = intent.getStringArrayListExtra("filterOptions")
Log.d("FilterActivity", "filter options $filters")
var query = db.collection("Cards").orderBy("resID")
for(filter in filters!!) {
query = query.whereEqualTo("rarity",filter)
}
query.get().addOnSuccessListener { querySnapshot ->
if(querySnapshot.isEmpty) Log.d("FilterActivity","is empty")
for(doc in querySnapshot.documents) {
Log.d("FilterActivity", "${doc.getString("name")} - ${doc.getString("rarity")}")
}
}
}
}
答案 0 :(得分:1)
基本上,您正在尝试执行 OR 操作,该操作将检索所有文档,其中稀有字段与数组中的任何值匹配。
您正在尝试使用新的Firebase whereIn操作,您可以在其中传递值数组,但是过滤器中最多只能有 10 个值
FirebaseFirestore.getInstance()
.collection("Cards")
.orderBy("resID")
.whereIn("rarity",filters!!.toList())
.get().addOnSuccessListener { querySnapshot ->
if (querySnapshot.isEmpty) Log.d("FilterActivity", "is empty")
for (doc in querySnapshot.documents) {
Log.d("FilterActivity", "${doc.getString("name")} - ${doc.getString("rarity")}")
}
}
过滤器arraylist最多可以包含10个值
答案 1 :(得分:0)
您能否在Firestore中的一个查询中将多个whereEqualTo操作链接在一起
您可以根据需要在EqualTo操作中进行链接。
您的代码+=
运算符中的问题。您无法对两个查询对象进行添加/串联。要解决此问题,请更改以下代码行:
query += query.whereEqualTo("rarity",filter)
到
query = query.whereEqualTo("rarity",filter)