Firestore возвращает удаленные документы в запросах - PullRequest
0 голосов
/ 03 ноября 2019

Я использую GeoFirestore GeoQueryDataEventListener.

В данный момент я тестирую на 2 устройствах. User1 выполняет поиск, чтобы увидеть, есть ли поблизости другие документы с GeoQuery - если документов не существует, создается новый документ. Затем User2 выполнит поиск и найдет документ пользователя 1.

Проблема в том, что когда User2 выполняет GeoQuery, он часто возвращает документы, которые были удалены.

Я не хочу получать документы из кэша. Если документ не существует на сервере, я не хочу, чтобы он возвращался. Я отключил сохранение кэша в своем коде:

val settings: FirebaseFirestoreSettings = FirebaseFirestoreSettings.Builder().setPersistenceEnabled(false).build()
val db by lazy { FirebaseFirestore.getInstance() }

db.firestoreSettings = settings

Однако мой GeoQuery по-прежнему возвращает документы из кэша.

Сказав это, большую часть времени GeoFire говорит, что документ из кэша, но это не так:

Пример 1 - следующий документ с z2sniJhKrWpZhX ID был удален. Затем я запросил базу данных, и этот документ был возвращен в onDocumentEntered:

nearbyUsers = geoFirestore.queryAtLocation(currentLocation, 1.0)
nearbyUsers.addGeoQueryDataEventListener(object : GeoQueryDataEventListener {

override fun onDocumentEntered(documentSnapshot: DocumentSnapshot, location: GeoPoint) {
                Log.d(TAG, "onDocumentEntered: user1: ${documentSnapshot.getString("user1")} | docId: ${documentSnapshot.id} | fromCache: ${documentSnapshot.metadata.isFromCache}")

onDocumentEntered: user1: 6IXCuAzK76JWP7F3h414IShm1 | docId: z2sniJhKrWpZhX | fromCache: true

Пример 2 - Следующий документ с yRFjKHEyGXclKcS ID был не удален,Затем я запросил базу данных, и этот документ был возвращен в onDocumentEntered:

nearbyUsers = geoFirestore.queryAtLocation(currentLocation, 1.0)
nearbyUsers.addGeoQueryDataEventListener(object : GeoQueryDataEventListener {

override fun onDocumentEntered(documentSnapshot: DocumentSnapshot, location: GeoPoint) {
                Log.d(TAG, "onDocumentEntered: user1: ${documentSnapshot.getString("user1")} | docId: ${documentSnapshot.id} | fromCache: ${documentSnapshot.metadata.isFromCache}")

onDocumentEntered: user1: 6IXCuAzK76JWP7F3h414IShm1 | docId: yRFjKHEyGXclKcS | fromCache: true

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

Все, что я хочу, это выполнить GeoQuery (GeoQueryDataEventListener), который возвращает действующие документы (без кэша). Если это невозможно, я бы с удовольствием отфильтровал на основе documentSnapshot.metadata.isFromCache - но даже это невозможно, потому что иногда он говорит, что документ из кеша, хотя это не так.

Любой совет приветствуется.

Редактировать: Если я получаю документ из onDocumentEntered() - он обычно из кэша с первого раза. Затем, если я выполню GeoQuery.removeAllListeners(), а затем снова, тот же документ будет извлечен, но не из кэша. В этом видео говорится, что я должен получить второй обратный вызов с сервера, если я подключен к Интернету - однако мне нужно запросить базу данных в отдельном вызове. Мне нужен документ, полученный с сервера (не из кэша) с первой попытки. Как мне этого добиться?

...