abuka123
abuka123

Reputation: 451

How to remove two documents in Firebase cloud database?

I wrote the following code that deletes two documents from the cloud Firebase database:

fireDB.document(groupPath).collection("users").document(phoneNumber).delete().addOnSuccessListener(new OnSuccessListener<Void>() {

            @Override
            public void onSuccess(Void aVoid) {
                fireDB.collection("users").document(phoneNumber).delete().addOnSuccessListener(new OnSuccessListener<Void>() {

                    @Override
                    public void onSuccess(Void aVoid) {
                        Log.d(this.getClass().getName(), "DocumentSnapshot successfully deleted");
                        Toast.makeText(getApplicationContext(),R.string.successfully_deleted_user,Toast.LENGTH_LONG).show();
                        finish();
                    }
                }).addOnFailureListener(new OnFailureListener() {

                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.w(this.getClass().getName(), "Error deleting document", e);
                        Toast.makeText(getApplicationContext(),R.string.failed_to_delete_user,Toast.LENGTH_LONG).show();
                    }
                });
                Log.d(this.getClass().getName(), "DocumentSnapshot successfully deleted");
            }
        }).addOnFailureListener(new OnFailureListener() {

            @Override
            public void onFailure(@NonNull Exception e) {
                Log.w(this.getClass().getName(), "Error deleting document", e);
                Toast.makeText(getApplicationContext(),R.string.failed_to_delete_user,Toast.LENGTH_SHORT).show();
            }
        });

The problem with that code is that it deletes first document and then deletes second document, meaning if the first try will delete it successfully and the second one will fail to delete it, there is going to be a problem. Is it possible to delete two documents in Firebase cloud database so the result could be of of the following two options:

  1. Both of the documents are deleted.
  2. Both of the document are not deleted.

Is it possible to do?

Upvotes: 1

Views: 34

Answers (1)

Frank van Puffelen
Frank van Puffelen

Reputation: 598847

As robsiemb commented, you'll want to use a batch write or transaction for this.

As far as I can see, the equivalent from your code would be something like this:

// Get a new write batch
WriteBatch batch = db.batch();

DocumentReference docRef1 = fireDB.document(groupPath).collection("users").document(phoneNumber);
DocumentReference docRef2 = fireDB.collection("users").document(phoneNumber)
DocumentReference laRef = db.collection("cities").document("LA");
batch.delete(docRef1);
batch.delete(docRef2);

// Commit the batch
batch.commit().addOnCompleteListener(new OnCompleteListener<Void>() {
    @Override
    public void onComplete(@NonNull Task<Void> task) {
        // ...
    }
});

Upvotes: 1

Related Questions