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 【问题描述】:

我有问题。在下面的屏幕截图中,您可以看到我的数据库的结构。我需要过滤关于两个字段的查询: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!

有什么方法可以让我做不同的事情吗?

【问题讨论】:

【参考方案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 的问题

orderByChild 在 Firebase 中不起作用

Firebase .orderByChild().equalTo().once().then() 当孩子不存在时承诺

firebase 和 Ionic 2 上的降序 orderByChild()

这个 orderByChild Firebase 实时代码有啥问题?

OrderByKey 工作正常,但 OrderByChild 在 firebase 实时数据库中给出了意想不到的结果