首页 > 解决方案 > firebase 查询 orderByChild().equalTo() android kotlin 的问题

问题描述

我有个问题。在下面的屏幕截图中,您可以看到我的数据库的结构。我需要过滤关于两个字段的查询:subgrouptime.

我写了以下代码:

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!

有什么办法我可以做不同的吗?

在此处输入图像描述

标签: androidfirebasekotlinfirebase-realtime-databasegoogle-cloud-platform

解决方案


正如错误消息所述:

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")

推荐阅读