Как обнаружить удаление поля внутри документа в firestore?

#android #firebase #google-cloud-firestore

#Android #firebase #google-облако-firestore

Вопрос:

Вот код, который мы можем использовать, чтобы узнать, добавлен, изменен или удален документ:

 db.collection("cities")
        .whereEqualTo("state", "CA")
        .addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@Nullable QuerySnapshot snapshots,
                                @Nullable FirebaseFirestoreException e) {
                if (e != null) {
                    Log.w(TAG, "listen:error", e);
                    return;
                }

                for (DocumentChange dc : snapshots.getDocumentChanges()) {
                    switch (dc.getType()) {
                        case ADDED:
                            Log.d(TAG, "New city: "   dc.getDocument().getData());
                            break;
                        case MODIFIED:
                            Log.d(TAG, "Modified city: "   dc.getDocument().getData());
                            break;
                        case REMOVED:
                            Log.d(TAG, "Removed city: "   dc.getDocument().getData());
                            break;
                    }
                }

            }
        });
  

Есть ли способ для клиента узнать, удалил ли другой клиент поле внутри документа?

Ответ №1:

Firestore SDK не предоставляет прямого способа обнаружить эту ситуацию. Вам нужно будет написать код для сравнения предыдущего снимка с новым снимком, чтобы увидеть, были ли добавлены, изменены или удалены какие-либо поля. Ваше решение должно будет:

  • Сохраните снимок запроса из последнего вызова вашего прослушивателя и сравните его с текущим снимком
  • Повторите каждый новый DocumentSnapshot, содержащийся в QuerySnapshot, и найдите соответствующий предыдущий DocumentSnapshot из сохраненного QuerySnapshot.
  • Отделите Map<String, Object> от данных текущего и предыдущего DocumentSnapshot, чтобы найти конкретное изменение

Очевидно, что это нетривиальный объем кода, и он будет сильно зависеть от фактических данных поля, которые вы хотите сравнить.