即使我禁用了持久性,Firestore 仍在从缓存中检索文档

Posted

技术标签:

【中文标题】即使我禁用了持久性,Firestore 仍在从缓存中检索文档【英文标题】:Firestore still retrieving documents from cache even though I've disabled persistence 【发布时间】:2019-11-29 01:59:29 【问题描述】:

即使我明确告诉它不要这样做,我的 Firestore 仍在从缓存中检索文档:

class MainActivity : AppCompatActivity() 

    val db = FirebaseFirestore.getInstance()

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        val dbSettings = FirebaseFirestoreSettings.Builder().setPersistenceEnabled(false).build()
        db.firestoreSettings = dbSettings

上面是我设置 Firestore 设置的启动器活动。

在我的片段中,我执行GeoFirestore GeoQuery

class MapFragment : Fragment() 
    val instances = FirebaseFirestore.getInstance().collection("instances")
    val geoFirestore = GeoFirestore(instances)
    lateinit var nearbyDocs: GeoQuery

    private fun searchNearby()
        nearbyDocs = geoFirestore.queryAtLocation(currentLocation, 1.0)
        nearbyDocs.addGeoQueryDataEventListener(object : GeoQueryDataEventListener 

            override fun onDocumentEntered(documentSnapshot: DocumentSnapshot, location: GeoPoint) 
               Log.d(TAG, "onDocumentEntered: user1: $documentSnapshot.getString("user1")?.substring(0, 3) | docId: $documentSnapshot.id.substring(0, 5) | fromCache: $documentSnapshot.metadata.isFromCache")
               Log.d(TAG, "isPersistanceEnabled2: $db.firestoreSettings.isPersistenceEnabled")
            
    

这是它记录的内容:

onDocumentEntered: user1: 0X6 | docId: lPLFf | fromCache: true
isPersistanceEnabled2: false

这没有意义 - 即使我的持久性已关闭,我仍在接收缓存的文档。

知道问题出在哪里吗?

编辑:我已尝试清除缓存,但没有解决问题。

【问题讨论】:

请编辑问题以准确解释您如何观察到文档肯定来自缓存而不是服务器。 已编辑 - 当它再次发生时,我将包含缓存的文档日志。 可能,Doug 没有看到您的回复,因为您还没有用 @ 标记他。我猜他本可以帮上忙的 @DougStevenson 我已经用一些缓存检索示例更新了我的答案 【参考方案1】:

您现在可以选择是仅从服务器获取数据,还是仅从缓存中获取数据,如下所示(仅服务器示例):

DocumentReference documentReference= FirebaseFirestore.getInstance().document("example");
documentReference.get(Source.SERVER).addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() 
    @Override
    public void onSuccess(DocumentSnapshot documentSnapshot) 
            //...
    
);

仅用于缓存,只需将上面的代码更改为 Source.CACHE。

默认情况下,这两种方法仍会尝试服务器并回退到缓存。

【讨论】:

谢谢,这可以解决我的问题 - 但我正在使用库进行查询:github.com/imperiumlabs/GeoFirestore-android 所以我无法直接访问我的代码。 @Zorgan,由于 geofirestore 没有强制服务器读取的选项,您只需将此库添加为模块并更改此特定部分

以上是关于即使我禁用了持久性,Firestore 仍在从缓存中检索文档的主要内容,如果未能解决你的问题,请参考以下文章

Firestore - 使用缓存直到在线内容更新

缓存视频 Firestore

即使没有数据更改,Firestore 缓存也无法正常工作

Google Firestore 是缓存文档和集合还是总是请求新的?

即使从缓存中获取数据,Firestore 数据库读取计数也会增加

无法在 Firestore 中禁用离线数据