Android Kotlin Firebase多次调用orderByChild过滤字段报错如何解决?
你遇到的报错是因为Firebase Realtime Database原生不支持在单次查询中组合多个orderByChild调用,这是平台本身的查询限制,以下是两种可行的实现方案:
方案1:新增组合查询字段(推荐,性能最优)
你可以在每一条数据库记录中新增一个组合字段,比如命名为subgroup_time,存储的值为subgroup字段值和time字段值的拼接结果,比如你要查询的场景对应值就是first_12:00 - 13:30,后续新增数据时同步写入该字段即可。
修改后的查询代码如下:
private fun readFromDatabase() { ref?.orderByChild("subgroup_time") ?.equalTo("first_12:00 - 13:30") ?.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) day?.let { list.add(it) } } adapter.submitList(list) } } override fun onCancelled(error: DatabaseError) { // 可按需添加异常处理逻辑 } }) }
这种方案的查询性能和单字段过滤一致,适合数据量较大的场景。
方案2:服务端单字段过滤+客户端二次过滤
如果不想修改现有数据库结构,且你的数据量级较小,可以先按其中一个字段做服务端过滤,拿到结果后在客户端做第二层过滤,示例代码如下:
private fun readFromDatabase() { // 先按subgroup做服务端过滤 ref?.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) // 客户端二次过滤time字段 day?.takeIf { it.time == "12:00 - 13:30" }?.let { list.add(it) } } adapter.submitList(list) } } override fun onCancelled(error: DatabaseError) { // 可按需添加异常处理逻辑 } }) }
注意该方案在数据量较大时会浪费带宽和客户端性能,仅适合小数据量场景使用。
内容的提问来源于stack exchange,提问作者onesector
相关产品推荐
相关产品推荐

