我正在构建一个聊天应用,这就是我的数据库的样子:
因此,我目前有一个users
节点和一个chats
节点。
users
节点保存用户当前所在的上一个上次登录日期和聊天ID 。在chats
节点中,保存了构成会话一部分的用户ID 以及具有 Id 的消息 >,内容,发送日期和发送用户。
当前,我正在构建活动,在该活动中显示用户所属的对话(使用recyclerview)。
为了能够了解用户所属的对话,而不是检索所有对话,我检索了user
节点中的聊天ID ,并将其全部放入ArrayList<String>
。
检索这些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)
也从不实际打印。
答案 0 :(得分:2)
很难理解您要执行的操作,但是据我推测,您错过了一个orderByKey()
通话:
val query = db.orderByKey().equalTo(it)
当您不调用任何orderBy...()
方法时,节点将按其优先级进行排序。这是API早期的遗留下来的东西,几乎没有实际用途,因此这些天主要意味着您必须在过滤之前调用orderBy...()
。