firebase 查询 orderByChild().equalTo() android kotlin 的问题

Problem with firebase query 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:您不能组合多个 orderBy 调用!

有什么不同的方法吗?

如其所说,您不能合并多个 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)}

如错误消息所述:

java.lang.IllegalArgumentException: You can't combine multiple orderBy calls

无法在单个查询中合并多个 orderByChild() 方法调用。 Firebase 实时数据库 支持对单个子 属性.

的查询

要解决这个问题,您可以考虑创建一个包含这两个值的新字段。您的节点应如下所示:

Firebase-root
  |
  --- classRooms
        |
        - 0
          |
          --- time_subgroup: "12:00 - 13:30_first"

如您所见,time_subgroup 属性 结合了您要过滤的两个值。

但是有一个down-site。如果要对字符串进行排序,则顺序始终为 lexicographically.

与实时数据库不同,Cloud Firestore allows compound queries。所以我建议你试试看。因此,像下面这样的查询将在 Cloud Firestore 中完美运行,无需创建组合 属性.

classRoomsRef.whereEqualTo("time", "12:00 - 13:30").whereEqualTo("subgroup", "first")