android - firebase 查询 orderByChild().equalTo() android kotlin 的问题
问题描述
我有个问题。在下面的屏幕截图中,您可以看到我的数据库的结构。我需要过滤关于两个字段的查询:subgroup
和time
.
我写了以下代码:
private fun readFromDatabase() {
ref?.orderByChild("time")
?.equalTo("12:00 - 13:30")
?.orderByChild("subgroup")
?.equalTo("first")
?.addValueEventListener(object: ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.exists()) {
val list = ArrayList<Day>()
for (daySnapshot in snapshot.children) {
val day = daySnapshot.getValue(Day::class.java)
list.add(day!!)
}
adapter.submitList(list)
}
}
override fun onCancelled(error: DatabaseError) {
}
})
}
但是,我得到了错误:java.lang.IllegalArgumentException: You can't combine multiple orderBy calls!
有什么办法我可以做不同的吗?
解决方案
正如错误消息所述:
java.lang.IllegalArgumentException:不能组合多个 orderBy 调用
您无法orderByChild()
在单个查询中组合多个方法调用。Firebase 实时数据库仅支持对单个子属性的查询。
为了解决这个问题,您可能会考虑创建一个包含两个值的新字段。您的节点应如下所示:
Firebase-root
|
--- classRooms
|
- 0
|
--- time_subgroup: "12:00 - 13:30_first"
如您所见,该time_subgroup
属性结合了您要过滤的两个值。
但是有一个下站点。如果要对字符串进行排序,则顺序始终为lexicographically。
因此,与实时数据库不同,Cloud Firestore允许复合查询。所以我建议你试试。因此,像下面这样的查询将在 Cloud Firestore 中完美运行,而无需创建组合属性。
classRoomsRef.whereEqualTo("time", "12:00 - 13:30").whereEqualTo("subgroup", "first")
推荐阅读
- rust - 在结构中存储 HashMap 的迭代器
- python - 在单元格中搜索特定字符串,然后只返回字符串后面的特定值
- r - R:在控制台中显示一个连续的微调器,同时代码完成执行
- arrays - PowerShell 数组迭代或解析问题?
- html - 如何强制 3 个按钮在所有屏幕尺寸上均匀显示在同一行?
- sqlite - 寻求有关创建 sqlite 查询以根据 FIFO 方法处理买卖交易并生成组合摘要的建议
- c# - 为什么 md5 哈希与登录时的文本密码不匹配?
- python - AWS Sam 调用本地 lambda 的问题
- php - 逗号前面的零不显示
- go - 如何获取 gRPC 响应限制