android - 即使在我删除它们后,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.")
}
解决方案
当使用Query#addValueEventListener()方法时,这意味着您正在尝试侦听实时更新。话虽如此,数据库中发生的并与您的查询相对应的每一次更改都会触发您的 onDataChange() 方法。由于当您注销时,您从正在收听的查询中删除了一个值,因此您的令牌会再次被写入,因此会出现这种行为。这种情况一次又一次地发生。
要解决这个问题,只需将上述方法调用更改为Query#addListenerForSingleValueEvent()。这意味着它只侦听一次更改。
推荐阅读
- ruby-on-rails - Rails对数组属性的多项选择不起作用
- java - 如何更改禁用的 jbutton 的颜色?
- wpf - Prism/WPF 中的新外壳/窗口显示错误视图
- awk - 双向运算符如何用于 (g)awk?
- kubernetes - 自动设置具有多个 pod 的 Kubernetes 集群
- vba - 如何显示带有法语口音的字母:é 和其他喜欢的字母?
- c - 为什么当经过的时间很短时,clock() 函数有时不准确?
- .net - [AfterStep] 中的断言未设置 ScenarioContext.Current.TestError
- postgresql - 多次更新性能提升
- php - 如果对象 id 已知,Laravel 获取对象属性