Как узнать, удалил ли конкретный вызов документ в FirebaseFirestore? - PullRequest
0 голосов
/ 30 сентября 2019

Я написал транзакцию так:

db.runTransaction(new Transaction.Function<Void>() {
            @Override
            public Void apply(Transaction transaction) throws FirebaseFirestoreException {
                DocumentSnapshot documentSnapshot = transaction.get(deleteRef);
                if(documentSnapshot.exists())
                {
                    transaction.delete(deleteRef);    
                }
            return null;
        }
    }).addOnSuccessListener(new OnSuccessListener<Void>() {
        @Override
        public void onSuccess(Void aVoid) {
        // implement logic
        }
    }).addOnFailureListener(new OnFailureListener() {
         @Override
         public void onFailure(@NonNull Exception e) {

        }
    });

Теперь, когда 2 клиента A и B выполняют эту транзакцию одновременно, согласно этому коду, только один может быть успешным, и соответствующая логика будет реализована. .

Но, к сожалению, эта транзакция не выполняется из-за следующей ошибки:

Каждый документ, считанный в транзакции, также должен быть записан.

Пожалуйстапомогите, спасибо.

Ответы [ 2 ]

1 голос
/ 01 октября 2019

Похоже, что вы действительно хотите, чтобы транзакция не прошла, как указано (поскольку она находилась в состоянии, когда обновление документа не должно происходить). Во-первых, попробуйте просто проигнорировать сообщение, поскольку оно говорит вам, почему транзакция не удалась, и вы знаете, что это не проблема.

Во-вторых, если вам не нравится это сообщение об ошибке, попробуйте выдать новоенепроверенное исключение (например, RuntimeException) из вашего обработчика транзакций в тех случаях, когда не следует вносить изменения в ранее прочитанный документ. Вы можете получить новое сообщение об ошибке в обработчике ошибок задачи, но результат будет таким же - никаких изменений в документах не было.

0 голосов
/ 05 октября 2019

Попробуйте заменить следующее:

if(documentSnapshot.exists())
{
  transaction.delete(deleteRef);    
}

на следующее:

transaction.delete(deleteRef); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...