Firestore: проверка NotNull в транзакции и удержание от вызова обратного вызова OnSuccessful - PullRequest
0 голосов
/ 11 мая 2019

В функции apply моей транзакции Firestore я написал DocumentSnapshot snapshot = transaction.get(xyz);, чтобы получить ссылку на снимок документа. Я хочу прочитать одно из полей, но прежде чем я должен проверить, содержится ли это поле (if(snapshot.contains("the field"))) и, если оно не равно нулю (if(snapshot.getDouble("the field")) != null). В противном случае я показываю сообщение об ошибке.

Кроме того, я написал сообщение проверки в обратном вызове OnSuccess, которое срабатывает, если транзакция может быть запущена ( т.е.: , если apply возвращено).

Таким образом, будет отображаться как сообщение об ошибке, так и сообщение проверки.

Ниже приведен пример:

FirebaseFirestore.getInstance().runTransaction(new Transaction.Function<Void>() {
                                    @Override
                                    public Void apply(@NonNull Transaction transaction) throws FirebaseFirestoreException {
                                        DocumentSnapshot snapshot = transaction.get(object_to_update);
                                        if(snapshot.contains("amount") && snapshot.getDouble("amount") != null) {
                                            double new_amount = snapshot.getDouble("amount") + seek_bar_value;
                                            transaction.update(object_to_update, "amount", new_amount);

                                        } else {

                                            Toast.makeText(context, "Error: Unable to find a required field to process the transaction correctly.", Toast.LENGTH_SHORT).show();
                                        }
                                        return null;
                                    }
                                }).addOnFailureListener(new OnFailureListener() {
                                    @Override
                                    public void onFailure(@NonNull Exception e) {
                                        Toast.makeText(context, "Error: Unable to update the data.", Toast.LENGTH_SHORT).show();
                                    }
                                }).addOnSuccessListener(new OnSuccessListener<Void>() {
                                    @Override
                                    public void onSuccess(Void aVoid) {
                                        Toast.makeText(context, "Congratulations, the data has been updated.", Toast.LENGTH_SHORT).show();

Итак, проблема в том, что сообщение «Ошибка: невозможно найти обязательное поле для правильной обработки транзакции». и {сообщение «Поздравляем, данные обновлены». или «Ошибка: невозможно обновить данные».} оба будут показаны.

Как я мог решить эту проблему? Возможно, я мог бы использовать логическое значение в обратном вызове OnSuccess, чтобы узнать, содержит ли проверки apply Содержит и NotNull сообщение об ошибке, поэтому например, OnSuccess может показать сообщение проверки. Но есть ли другой способ решить проблему?

1 Ответ

1 голос
/ 11 мая 2019

Возможно, я мог бы использовать логическое значение в обратном вызове OnSuccess, чтобы узнать, Применить проверки Contains и NotNull не показывали сообщение об ошибке, поэтому что OnSuccess может показать сообщение проверки, например. Но это Есть ли другой способ решить проблему?

Вам следует прочитать документацию по , передавая информацию из транзакций . Это дает вам образец, чтобы использовать, чтобы определить, была ли ваша транзакция успешной или неудачной. Вы должны выбросить исключение из вашей функции apply, чтобы транзакция не прошла правильно. Прямо сейчас вы безоговорочно возвращаете ноль, что всегда означает, что транзакция прошла успешно.

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