You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase Realtime Database删除的Token数据反复自动再生如何解决?

问题根因

你代码里的核心问题出在Token存在性校验用了持续实时监听器,删除操作触发了监听器的回调自动重写了Token:

  • 你在获取FCM Token后,使用addValueEventListener监听Token节点的变更,这个监听器会一直保持激活状态,只要监听路径下的数据发生变化就会触发回调
  • 你登出时删除Token的操作会触发该监听器回调,此时snapshot.exists()返回false,代码自动执行写入逻辑把Token重新存回数据库,就出现了删完立刻再生的现象

修复步骤

  1. 将Token存在性校验的实时监听器替换为单次查询监听器
    你只需要在获取到Token的时候判断一次是否已经存在,不需要持续监听,把代码中的addValueEventListener替换为addListenerForSingleValueEvent即可,修改后的示例:
myRef.child("Token").orderByChild("token").equalTo(firebaseToken)
    // 替换为单次查询,只会触发一次回调,不会监听后续数据变更
    .addListenerForSingleValueEvent(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()
        }
    })
  1. 修正登出删除逻辑的数据库实例引用
    你写入Token时指定了完整的数据库URL,删除时如果没指定会导致操作的是默认数据库实例,出现删错库的问题,修改删除代码的数据库实例初始化:
// 删除时也指定和写入相同的数据库URL,保证操作的是同一个库
val delRef = FirebaseDatabase.getInstance("https://trial-38785-default-rtdb.firebaseio.com/")
    .getReference("AppUsers")
    .child("Doctor").child(currentId.toString())
    .child("Token").child(key.toString()).removeValue()                      
delRef.addOnSuccessListener {
    println("Removed.")
}.addOnFailureListener {
    println("Not Removed.")
}
  1. 可选优化:登出时主动删除FCM Token
    如果需要彻底避免当前设备后续再收到对应账号的推送,可以在登出时主动调用删除Token的接口:
FirebaseMessaging.getInstance().deleteToken().addOnCompleteListener {
    // 回调中再执行数据库删除操作即可
}

内容的提问来源于stack exchange,提问作者suhail zack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 15:06:06