首页 > 解决方案 > 即使在我删除它们后,Firebase 值也会不断重新生成

问题描述

我已经为这个问题苦苦挣扎了一个多星期,如果您知道解决方法,请帮助我。

在此处输入图像描述

我正在尝试从 Realtime Firebase 中的子节点中删除数据,但即使我删除了令牌数据,它也会继续重新生成。

这是我的代码:

当用户登录时,会自动生成 FCM 令牌(onCreate)。

当我尝试将他从他的帐户中注销时,我希望将令牌从令牌列表中删除,但即使我注销它也会继续重新生成

这是登录后重定向到的用户片段:

    val currentUser : String = firebaseAuth.currentUser?.uid.toString()
    val databaseReference = FirebaseDatabase.getInstance("https://trial-38785-default-rtdb.firebaseio.com/")
        .getReference("AppUsers").child("Doctor").child(currentUser)

        FirebaseMessaging.getInstance().token.addOnCompleteListener {
            if (it.isComplete) {
                val firebaseToken = it.result.toString()
                    val myRef =
                        FirebaseDatabase.getInstance("https://trial-38785-default-rtdb.firebaseio.com/")
                            .getReference("AppUsers").child("Doctor").child(currentUser)
                    myRef.child("Token").orderByChild("token").equalTo(firebaseToken)
                        .addValueEventListener(object : ValueEventListener {
                            override fun onDataChange(snapshot: DataSnapshot) {
                                val token : Token = Token(firebaseToken)
                                if (snapshot.exists()) {
                                    return
                                } else {
                                    databaseReference.child("Token")
                                        .child(currentdate.toString()).setValue(token)
                                }
                            }

                            override fun onCancelled(error: DatabaseError) {
                                Toast.makeText(context, error.message, Toast.LENGTH_LONG).show()
                            }

                        })
            }
        }.addOnFailureListener {
            Toast.makeText(context, it.message, Toast.LENGTH_LONG).show()
        }

这是医生注销的另一个片段。

按注销按钮这是我运行的代码

                    val delRef = FirebaseDatabase.getInstance().getReference("AppUsers")
                        .child("Doctor").child(currentId.toString())
                        .child("Token").child(key.toString()).removeValue()                      
                    delRef.addOnSuccessListener {
                        println("Removed.")
                    }.addOnFailureListener {
                        println("Not Removed.")
                    }
                

标签: androidfirebasekotlinfirebase-realtime-database

解决方案


当使用Query#addValueEventListener()方法时,这意味着您正在尝试侦听实时更新。话虽如此,数据库中发生的并与您的查询相对应的每一次更改都会触发您的 onDataChange() 方法。由于当您注销时,您从正在收听的查询中删除了一个值,因此您的令牌会再次被写入,因此会出现这种行为。这种情况一次又一次地发生。

要解决这个问题,只需将上述方法调用更改为Query#addListenerForSingleValueEvent()。这意味着它只侦听一次更改。


推荐阅读