无法使用equalTo()查询Firebase

时间:2020-02-12 15:08:21

标签: android firebase kotlin firebase-realtime-database

我正在构建一个聊天应用,这就是我的数据库的样子: Please, click here to see

因此,我目前有一个users节点和一个chats节点。

users节点保存用户当前所在的上一个上次登录日期聊天ID 。在chats节点中,保存了构成会话一部分的用户ID 以及具有 Id 消息 >,内容发送日期发送用户

当前,我正在构建活动,在该活动中显示用户所属的对话(使用recyclerview)。

为了能够了解用户所属的对话,而不是检索所有对话,我检索了user节点中的聊天ID ,并将其全部放入ArrayList<String>

Here is a picture that helps you see what goes in the ArrayList

检索这些ID并将其放入ArrayList的代码是这样的:

        db.addListenerForSingleValueEvent(object : ValueEventListener{
            override fun onCancelled(p0: DatabaseError) {
                TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
            }

            override fun onDataChange(p0: DataSnapshot) {
                p0.children.forEach{
                    chatsId.add(it.key.toString()) // ChatsId is the ArrayList<String>
                }
                getChats2()
            }

        })

此代码的工作原理就像一个魅力。 当我尝试查询chats节点只是为了检索具有等于上面代码中检索到的值的聊天时,就会出现问题。 **该代码在getsChat2()中实现**:

 db = FirebaseDatabase.getInstance().getReference("chats")

        // For each chatId, queries the DB to find the chat reference
        chatsId.forEach {
            val query = db.equalTo(it)
            query.addValueEventListener(object : ValueEventListener{
                override fun onCancelled(p0: DatabaseError) {
                    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
                }

                override fun onDataChange(p0: DataSnapshot) {
                    p0.children.forEach {it2->
                        println("Do something")
                        // Do something with the chat reference
                    }
                }

            })
        }

问题是,即使存在与chatsId变量具有相同值的节点,println("Do Something)也从不实际打印。

1 个答案:

答案 0 :(得分:2)

很难理解您要执行的操作,但是据我推测,您错过了一个orderByKey()通话:

val query = db.orderByKey().equalTo(it)

当您不调用任何orderBy...()方法时,节点将按其优先级进行排序。这是API早期的遗留下来的东西,几乎没有实际用途,因此这些天主要意味着您必须在过滤之前调用orderBy...()