Home > Blockchain >  The Firebase value keeps regenerating even after i delete them
The Firebase value keeps regenerating even after i delete them

Time:10-08

I've been struggling with this problem for more than a week help me out if you know the fix.

enter image description here

I am trying to delete the data from a child node in the Realtime Firebase but it keeps regenerating even when I delete the token data.

This is my code:

when a user logs in an FCM token is generated automatically (onCreate).

when I try to log him out of his account I want the token to be deleted from the token list but it keeps regenerating even when I logout

this is the User fragment is redirected to after login:

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

This is another fragment where the doctor logout.

pressing logout button this is the code i ran

                    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.")
                    }
                

CodePudding user response:

When using the Query#addValueEventListener() method, it means that you are trying to listen for real-time updates. That being said, every change that takes place in the database and corresponds to your query, always triggers your onDataChange() method. Since when you are logging out, you remove a value from the query you are listening to, your token gets written again, hence that behavior. This is happening over and over again.

To solve this, simply change the above method call to Query#addListenerForSingleValueEvent(). This means that it listen for changes only once.

CodePudding user response:

Hey guys I finally figured out what I was doing wrong, I just had to move my code (myRef) outside of FirebaseMessaging.

  • Related