即使在我删除它们后,Firebase 值也会不断重新生成

Posted

技术标签:

【中文标题】即使在我删除它们后,Firebase 值也会不断重新生成【英文标题】:The Firebase value keeps regenerating even after i delete them 【发布时间】:2021-11-28 08:16:38 【问题描述】:

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

enter image description here

我正在尝试从 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.")
                    
                

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

如果您认为我的回答对您有所帮助,请考虑通过单击左侧投票箭头下方的复选标记 (✔️) 来接受它。应将颜色更改为绿色。我真的很感激。谢谢!【参考方案2】:

我终于弄清楚我做错了什么,我只需要将我的代码 (myRef) 移到 FirebaseMessaging 之外。

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于即使在我删除它们后,Firebase 值也会不断重新生成的主要内容,如果未能解决你的问题,请参考以下文章

即使正确设置了所有权限,Cloudkit 也会不断给出创建权限错误

即使超过缓存控制年龄限制,值也会从缓存中加载

即使有检查,空值也会出现快速错误访问错误

jHipster - 即使从实体中删除权限,AngularJS 路由也会重定向到登录

即使在登录后 Django 也会重定向到登录页面

即使在 Flutter 中授予权限后,通知访问屏幕也会不断弹出