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
相关产品推荐
相关产品推荐

