Но проблема в том, что когда я добавляю уже существующий элемент в массив, элемент не вставляется, но вызывается addOnSuccessListener
, увеличивается viewsCount и никогда не вызывается failureListener
.
Это нормальное поведение. Обратите внимание, что OnSuccessListener
, который вы используете в данный момент, вызывается для операции, которую вы выполнили в базе данных, только если конечный результат этой конкретной операции был успешным.
В вашем конкретном случае:
.update("views", FieldValue.arrayUnion(currentUser.getUid())
OnSuccessListener
вызывается после успешной операции, которая добавляет uid
в ваш массив views
. Не имеет значения, был ли этот uid
уже там или нет, вся операция прошла успешно. Это правда, что uid
не был добавлен в массив, но даже если операция прошла успешно.
Пожалуйста, помните, что Задача считается успешной, когда работа, представленная Задачей, завершена, как и ожидалось. , без ошибок. С другой стороны, OnFailureListener
вызывается в случае сбоя Задачи с исключением. Так что это может быть результатом или Исключением, а не обоими одновременно. Таким образом, добавление uid
, которое уже существует в массиве, никогда не может считаться ошибкой.
Чтобы решить эту проблему, вы должны создать вызов get()
, получить весь документ и проверить наличие uid
в views
массиве. Если он не существует, создайте обновление и увеличьте счетчик, в противном случае не предпринимайте никаких действий.