You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase实时数据库如何筛选获取Dislikes中的true值?

问题描述

我的数据库布局如下:
当前每个用户的数据库布局

我目前能通过以下代码成功从Firebase实时数据库获取用户名并设置到TextView:

val name = findViewById<TextView>(R.id.Nameuser)
myRef.child(userid).child("UserName").get().addOnSuccessListener {
    Log.i("firebase", "Got value ${it.value}")
    name.setText("Name: ${it.value}")
}.addOnFailureListener{
    Log.e("firebase", "Error getting data", it)
}

现在需要获取Dislikes节点中值为true的条目来展示用户的讨厌列表。最初直接访问Dislikes会返回所有true和false值,于是我添加了.equalTo(true)来筛选,代码如下:

val dislikes = findViewById<TextView>(R.id.Dislikes)
myRef.child(userid).child("Dislikes").equalTo(true).get().addOnSuccessListener {
    Log.i("firebase", "Got value dis ${it.value}")
    dislikes.setText("Dislikes: ${it.value}")
}.addOnFailureListener{
    Log.e("firebase", "Error getting data", it)
}

但运行时触发异常:

java.lang.IllegalArgumentException: When using orderByPriority(), values provided to startAt(), startAfter(), endAt(), endBefore(), or equalTo() must be valid priorities.

请问如何修复该错误?或有其他方法筛选获取仅true值并存入数组使用?

解决方案

方法1:修复Firebase查询逻辑

Firebase实时数据库调用equalTo()前必须指定排序规则,直接调用equalTo(true)会默认按优先级排序,而你的节点未设置优先级,因此报错。针对Dislikes结构,需先按值排序再筛选:

val dislikes = findViewById<TextView>(R.id.Dislikes)
myRef.child(userid).child("Dislikes")
    .orderByValue() // 指定按节点值排序
    .equalTo(true) // 筛选值为true的条目
    .get().addOnSuccessListener { dataSnapshot ->
        val dislikeList = mutableListOf<String>()
        for (snapshot in dataSnapshot.children) {
            // 节点key即为讨厌的内容(如"Banana")
            snapshot.key?.let { dislikeList.add(it) }
        }
        dislikes.setText("Dislikes: ${dislikeList.joinToString(", ")}")
    }.addOnFailureListener{
        Log.e("firebase", "Error getting data", it)
    }

方法2:客户端本地筛选

若Dislikes节点数据量不大,可先获取全部数据,再在客户端筛选值为true的条目:

val dislikes = findViewById<TextView>(R.id.Dislikes)
myRef.child(userid).child("Dislikes").get().addOnSuccessListener { dataSnapshot ->
    val dislikeList = mutableListOf<String>()
    for (snapshot in dataSnapshot.children) {
        val isDisliked = snapshot.value as Boolean
        if (isDisliked) {
            snapshot.key?.let { dislikeList.add(it) }
        }
    }
    dislikes.setText("Dislikes: ${dislikeList.joinToString(", ")}")
}.addOnFailureListener{
    Log.e("firebase", "Error getting data", it)
}

内容的提问来源于stack exchange,提问作者Joshu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 05:52:47