Firebase 如何避免拾取已经存在的数据库节点——Recyclerview项
我面临的问题是在更新用户消息详细信息时,例如用户是否看到消息,firebase使用以前的消息ID创建节点,并导致在聊天应用程序中创建空文本 我的聊天工作流程是: --在使用Groupie Recyclerview向另一个用户发送消息时,我创建了一个单独的引用,父节点为“Messages”。看起来像这样Firebase 如何避免拾取已经存在的数据库节点——Recyclerview项,firebase,kotlin,firebase-realtime-database,android-recyclerview,Firebase,Kotlin,Firebase Realtime Database,Android Recyclerview,我面临的问题是在更新用户消息详细信息时,例如用户是否看到消息,firebase使用以前的消息ID创建节点,并导致在聊天应用程序中创建空文本 我的聊天工作流程是: --在使用Groupie Recyclerview向另一个用户发送消息时,我创建了一个单独的引用,父节点为“Messages”。看起来像这样 val ref = FirebaseDatabase.getInstance().getReference("/Messages/$fromId/$toId") val toRef = Fireb
val ref = FirebaseDatabase.getInstance().getReference("/Messages/$fromId/$toId")
val toRef = FirebaseDatabase.getInstance().getReference("/Messages/$toId/$fromId")
fromId——当前用户
toId—向其他收件人发送邮件
发送消息时,还有另一个功能,通过识别ChatFromItem Adapter和ChatToItem Adapter,从两端拾取侦听消息
在chattoadapter中,我将逻辑写入到状态
toRef.addListenerForSingleValueEvent(object :ValueEventListener{
override fun onCancelled(p0: DatabaseError) {
TODO("Not yet implemented")
}
override fun onDataChange(p0: DataSnapshot) {
for (ds in p0.children) {
val fromuserupdate = HashMap<String,String>()
if (chatMessage.fromId != FirebaseAuth.getInstance().uid && chatMessage.toId == FirebaseAuth.getInstance().uid){
val Totoken = ds.child("tokey").value.toString()
val Frommessageid = ds.child("fromkey").value.toString()
val toUserChatRef = FirebaseDatabase.getInstance().getReference("users-messages").child(fromId).child(toId).child(Totoken)
val fromUserref = FirebaseDatabase.getInstance().getReference("users-messages").child(toId).child(fromId).child(Frommessageid)
fromuserupdate.put("messageseen","true")
fromUserref.updateChildren(fromuserupdate as Map<String,Any>).addOnCompleteListener { }
toUserChatRef.updateChildren(fromuserupdate as Map<String,Any>).addOnCompleteListener { }
ChatFromItem
fromUserref.removeEventListener(this)
toUserChatRef.removeEventListener(this)
}
} })
}
}
如何通过不接触旧值来避免创建其他节点。听起来您希望在代码中获得有关数据库中修改的数据的更详细信息。在这种情况下,最好使用
ChildEventListener
而不是ValueEventListener
使用ChildEventListener
可以为添加、更新、删除或移动的每个子项调用,然后您可以轻松地根据这些子项更新UI。例如,如果只想将数据库中的新节点添加到列表中,可以执行以下操作:
toRef.addChildEventListener(object :ChildEventListener{
override fun onCancelled(p0: DatabaseError) {
TODO("Not yet implemented")
}
override fun onChildAdded(snapshot: DataSnapshot, previousChildKey: String) {
val fromuserupdate = HashMap<String,String>()
if (chatMessage.fromId != FirebaseAuth.getInstance().uid && chatMessage.toId == FirebaseAuth.getInstance().uid){
val Totoken = snapshot.child("tokey").value.toString()
val Frommessageid = snapshot.child("fromkey").value.toString()
...
}
})
...
toRef.addChildEventListener(对象:ChildEventListener{
已取消覆盖乐趣(p0:DatabaseError){
TODO(“尚未实施”)
}
重写onChildAdded(快照:DataSnapshot,previousChildKey:String){
val fromuserupdate=HashMap()
if(chatMessage.fromId!=FirebaseAuth.getInstance().uid&&chatMessage.toId==FirebaseAuth.getInstance().uid){
val Totoken=snapshot.child(“tokey”).value.toString()
val Frommessageid=snapshot.child(“fromkey”).value.toString()
...
}
})
...
非常感谢您的帮助。这些天来,我一直在ChildEventListener中测试ValueEventListener,因为旧值不是新值。当我按照您的方式应用时,我得到了预期的结果。
toRef.addChildEventListener(object :ChildEventListener{
override fun onCancelled(p0: DatabaseError) {
TODO("Not yet implemented")
}
override fun onChildAdded(snapshot: DataSnapshot, previousChildKey: String) {
val fromuserupdate = HashMap<String,String>()
if (chatMessage.fromId != FirebaseAuth.getInstance().uid && chatMessage.toId == FirebaseAuth.getInstance().uid){
val Totoken = snapshot.child("tokey").value.toString()
val Frommessageid = snapshot.child("fromkey").value.toString()
...
}
})
...