Каждый документ, прочитанный в транзакции, также должен быть написан: Исключение транзакции Firestore в Android - PullRequest
0 голосов
/ 29 сентября 2019

Транзакции Firestore дают мне следующую ошибку:

Причина: com.google.firebase.firestore.FirebaseFirestoreException: Каждый документ, прочитанный в транзакции, также должен быть написан.

Вот фрагмент кода:

   db.runTransaction(new Transaction.Function<Void>() {
        @Override
        public Void apply(Transaction transaction) throws FirebaseFirestoreException {


            DocumentReference docRef2 = db.collection("ABC").document(mMatchedUserId);

            DocumentReference ref3 = db.collection("XYZ").document(mCurrentUserId);
            DocumentReference ref4 = db.collection("XYZ").document(mMatchedUserId);


            DocumentSnapshot documentSnapshot2 = transaction.get(docRef2);

            if(documentSnapshot2.exists())
            {
                transaction.delete(docRef2);
                transaction.set(ref3, myMap1);
                transaction.set(ref4,myMap2);
            }

            return null;
        }
    }).addOnSuccessListener(new OnSuccessListener<Void>() {
        @Override
        public void onSuccess(Void aVoid) {
            Log.d(TAG, "Transaction success!");
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Log.w(TAG, "Transaction failure.", e);
        }
    });

Если я уберу это, если условие: if(documentSnapshot1.exists() && documentSnapshot2.exists()), тогда транзакция завершится успешно и ошибки не будет.

Но главноенастройки этой транзакции было условием if.Пожалуйста, помогите.

1 Ответ

1 голос
/ 29 сентября 2019

Проблема в вашем коде заключается в том, что внутри вашей транзакции вы читаете два документа:

DocumentSnapshot documentSnapshot1 = transaction.get(docRef1);
DocumentSnapshot documentSnapshot2 = transaction.get(docRef2);

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

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