Почему successListener вызывается, даже если элемент не вставлен в массив в документе Firestore? - PullRequest
4 голосов
/ 08 октября 2019

Я использую следующий код для добавления userId в массив в документе Cloud Firestore:

DocumentReference reference = firebaseFirestore.collection("photos").document(photoId);
reference.update("views", FieldValue.arrayUnion(currentUser.getUid()))
        .addOnSuccessListener(new OnSuccessListener<Void>()
        {
            @Override
            public void onSuccess(Void aVoid)
            {
                reference.update("viewsCount", FieldValue.increment(1));
            }
        });

Как вы можете видеть из кода, я хочу, чтобы viewsCount увеличивался только при добавлении элементав массив views.

Согласно этому документу Добавление данных , arrayUnion() добавляет элементы в массив, но только элементы, которых еще нет , и это точночто я хотел.

Но проблема в том, что когда я добавляю уже существующий элемент в массив, элемент не вставляется, но вызывается addOnSuccessListener, увеличивается viewsCount и никогда не вызывается faultListener. Есть ли способ предотвратить это? Я хочу, чтобы значение viewsCount увеличивалось только при вставке элемента в массив views.

1 Ответ

2 голосов
/ 08 октября 2019

Но проблема в том, что когда я добавляю уже существующий элемент в массив, элемент не вставляется, но вызывается addOnSuccessListener, увеличивается viewsCount и никогда не вызывается failureListener.

Это нормальное поведение. Обратите внимание, что OnSuccessListener, который вы используете в данный момент, вызывается для операции, которую вы выполнили в базе данных, только если конечный результат этой конкретной операции был успешным.

В вашем конкретном случае:

.update("views", FieldValue.arrayUnion(currentUser.getUid())

OnSuccessListener вызывается после успешной операции, которая добавляет uid в ваш массив views. Не имеет значения, был ли этот uid уже там или нет, вся операция прошла успешно. Это правда, что uid не был добавлен в массив, но даже если операция прошла успешно.

Пожалуйста, помните, что Задача считается успешной, когда работа, представленная Задачей, завершена, как и ожидалось. , без ошибок. С другой стороны, OnFailureListener вызывается в случае сбоя Задачи с исключением. Так что это может быть результатом или Исключением, а не обоими одновременно. Таким образом, добавление uid, которое уже существует в массиве, никогда не может считаться ошибкой.

Чтобы решить эту проблему, вы должны создать вызов get(), получить весь документ и проверить наличие uid в views массиве. Если он не существует, создайте обновление и увеличьте счетчик, в противном случае не предпринимайте никаких действий.

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