Хранение документа в Firestore: определить, была ли операция успешной на сервере, локально или неудачной? - PullRequest
0 голосов
/ 13 июня 2019

Я пишу Java-приложение для Android, используя Google Firestore.Когда пользователь создает данные, они должны храниться в Firestore (пользователь нажимает кнопку «отправить»).Приложение отображает ProgressBar, пока хранилище не будет успешным или не сможет работатьКак обнаружить данные хранятся (локально или на удаленном сервере)?Я хотел бы сообщить пользователю, является ли хранилище успешным (данные хранятся на сервере), локально успешным (сервер недоступен, но автономное хранилище в порядке) или неудачным.

Для завершения хранения на сервере,это легко обнаружить по регистрации OnCompleteListener в Задаче.

Но когда сервер недоступен, слушатель не вызывается (на самом деле, он вызывается позже, когда сервер снова доступен, нопользователь не может ждать так долго!).Я обнаружил, что можно получать уведомления, что данные хранятся локально с помощью EventListener, зарегистрированного в DocumentReference.Этот слушатель может получить информацию с помощью documentSnapshot.getMetadata (). IsFromCache () и documentSnapshot.getMetadata (). HasPendingWrites ().Но этот слушатель уведомляется также, когда сервер находится в сети и данные хранятся на сервере.

 progressBar.setVisibility(View.VISIBLE);
 final DocumentReference documentReference =
 FirebaseFirestore.getInstance().document(documentFirestorePath);
 documentReference. addSnapshotListener(this, MetadataChanges.INCLUDE,
 new EventListener<DocumentSnapshot>() {
     @Override
     public void onEvent(@Nullable final DocumentSnapshot documentSnapshot, @Nullable final FirebaseFirestoreException e) {
         Log.i("MyActivity", "isFromCache: "+documentSnapshot.getMetadata().isFromCache()+", write pending:
 "+documentSnapshot.getMetadata().hasPendingWrites());
     } });
 documentReference.set(newContact).addOnCompleteListener(new OnCompleteListener<Void>() {
     @Override
     public void onComplete(@NonNull final Task<Void> task) {
         Log.i("MyActivity", "completed");
         progressBar.setVisibility(View.INVISIBLE);
         if (task.isSuccessful()) {
             finish();
         } else {
             // Inform the customer the action failed
         }
     }
  });

Вот журналы, когда сервер находится в сети:

2019-06-13 08:11:14.126 I/MyActivity: isFromCache: true, write pending: false
2019-06-13 08:11:14.170 I/MyActivity: isFromCache: true, write pending: true
2019-06-13 08:11:14.218 I/MyActivity: isFromCache: false, write pending: true
2019-06-13 08:11:14.470 I/MyActivity: completed
2019-06-13 08:11:14.552 I/MyActivity: isFromCache: false, write pending: false

И журналыкогда сервер находится в автономном режиме:

2019-06-13 08:12:08.185 I/MyActivity: isFromCache: true, write pending: false
2019-06-13 08:12:08.215 I/MyActivity: isFromCache: true, write pending: true
And when the server is back, the following logs are added:
2019-06-13 08:12:40.460 I/MyActivity: isFromCache: false, write pending: true
2019-06-13 08:12:40.671 I/MyActivity: completed
2019-06-13 08:12:40.753 I/MyActivity: isFromCache: false, write pending: false

1 Ответ

0 голосов
/ 14 июня 2019

Наконец, достаточно сообщить пользователю, что его модификации хранятся (локально или на сервере).

Итак

addSnapshotListener(this, MetadataChanges.INCLUDE,
 new EventListener<DocumentSnapshot>()

достаточно: условие для проверки имеет hasPendingWrites == true.

Нет необходимости в OnCompleteListener.

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