Firestore返回查询中已删除的文档

时间:2019-11-03 06:28:39

标签: android firebase kotlin google-cloud-firestore geofire

我正在使用GeoFirestoreGeoQueryDataEventListener

目前,我正在使用2种设备进行测试。 User1搜索以查看GeoQuery附近是否还有其他文档-如果不存在文档,则创建一个新文档。然后User2将搜索并找到User1的文档。

问题在于,当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 -删除了以下ID为yRFjKHEyGXclKcS的文档。然后,我查询了数据库,并在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

这两个文档显然都来自缓存,即使其中一个文档在服务器上也是如此。

我所要做的就是执行一个返回实时文档(无缓存)的GeoQueryGeoQueryDataEventListener)。如果无法做到这一点,我很乐意根据documentSnapshot.metadata.isFromCache进行过滤-但这是不可能的,因为有时它说文档来自缓存,即使不是。

任何建议都值得赞赏。

编辑:如果我从onDocumentEntered()检索文档,通常是第一次从缓存中获取。然后,如果我执行GeoQuery.removeAllListeners(),然后再次执行,将检索同一文档,但不会从缓存中检索。 In this video表示如果我已连接到Internet,则应该从服务器接收第二次回调-但是我必须在单独的调用中查询数据库。我需要在第一次尝试时从服务器(不是缓存)检索到的文档。我该如何实现?

0 个答案:

没有答案