firebase 查询 orderByChild().equalTo() android kotlin 的问题
Posted
技术标签:
【中文标题】firebase 查询 orderByChild().equalTo() android kotlin 的问题【英文标题】:Problem with firebase query orderByChild().equalTo() android kotlin 【发布时间】:2021-12-24 04:48:00 【问题描述】:我有问题。在下面的屏幕截图中,您可以看到我的数据库的结构。我需要过滤关于两个字段的查询: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!
有什么方法可以让我做不同的事情吗?
【问题讨论】:
【参考方案1】:如错误消息所述:
java.lang.IllegalArgumentException: 你不能合并多个 orderBy 调用
您无法在单个查询中组合多个 orderByChild()
方法调用。 Firebase 实时数据库仅支持对单个子属性的查询。
要解决此问题,您可能会考虑创建一个包含两个值的新字段。您的节点应如下所示:
Firebase-root
|
--- classRooms
|
- 0
|
--- time_subgroup: "12:00 - 13:30_first"
如您所见,time_subgroup
属性结合了您要过滤的两个值。
但是有一个下站点。如果要对字符串进行排序,则顺序始终为lexicographically。
与实时数据库不同,Cloud Firestore 允许compound queries。所以我建议你试试。因此,像下面这样的查询将在 Cloud Firestore 中完美运行,而无需创建组合属性。
classRoomsRef.whereEqualTo("time", "12:00 - 13:30").whereEqualTo("subgroup", "first")
【讨论】:
【参考方案2】:就像它说的那样,您不能组合多个 orderBy 调用。您只需要过滤掉一个 orderBy 的结果。
private fun readFromDatabase()
ref?.orderByChild("time")
?.equalTo("12:00 - 13:30")
?.addValueEventListener(object: ValueEventListener
override fun onDataChange(snapshot: DataSnapshot)
if (snapshot.exists())
val list = snapshot.children
.map snapshot -> snapshot.getValue(Day::class.java)!!
.filter day -> "first".equals(day.subgroup)
【讨论】:
以上是关于firebase 查询 orderByChild().equalTo() android kotlin 的问题的主要内容,如果未能解决你的问题,请参考以下文章
firebase 查询 orderByChild().equalTo() android kotlin 的问题
Firebase .orderByChild().equalTo().once().then() 当孩子不存在时承诺
firebase 和 Ionic 2 上的降序 orderByChild()