Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 如何避免拾取已经存在的数据库节点——Recyclerview项_Firebase_Kotlin_Firebase Realtime Database_Android Recyclerview - Fatal编程技术网

Firebase 如何避免拾取已经存在的数据库节点——Recyclerview项

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

我面临的问题是在更新用户消息详细信息时,例如用户是否看到消息,firebase使用以前的消息ID创建节点,并导致在聊天应用程序中创建空文本

我的聊天工作流程是:

--在使用Groupie Recyclerview向另一个用户发送消息时,我创建了一个单独的引用,父节点为“Messages”。看起来像这样

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()

            ...

        } 
    })
    ...