将本地 Firestore 缓存与服务器显式同步

Posted

技术标签:

【中文标题】将本地 Firestore 缓存与服务器显式同步【英文标题】:Exxplicitly syncing of local Firestore cache with Server 【发布时间】:2021-05-20 16:55:57 【问题描述】:

我正在使用 Firestore DB,需要知道有没有办法将数据从本地缓存显式同步到服务器。因为我可以看到一些时间文件快照。 metadata.HasPendingWrite() 为真。

有没有办法获得待处理的文档计数或从待处理的文档中获取这些文档?

【问题讨论】:

【参考方案1】:

根据Firestore offline persistence的官方文档:

对于 androidios,默认启用离线持久化。

这意味着在离线时,尚未同步到服务器的待处理写入将保存在本地缓存中的队列中。这也意味着:

metadata.hasPendingWrite() 

将返回“true”,因为所有这些写入都处于“待处理”状态。设备重新连接后,队列中的所有内容都会与 Firebase 服务器同步,反之亦然。

我正在使用 Firestore DB,需要知道有没有办法将数据从本地缓存显式同步到服务器。

没有必要明确地做某事。 Firestore 会自动为您执行此操作。

有没有办法获得待处理的文档计数或从待处理的文档中获取这些文档?

是的,您可以创建一个查询,只计算处于“待处理”状态的文档。基本上是尚未与 Firebase 服务器同步的文档。

编辑:

假设您有一个产品集合,并且您想要获取处于“待处理”状态的文档计数,请使用以下代码行:

productsRef.addSnapshotListener(new EventListener<QuerySnapshot>() 
    @Override
    public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException e) 
        if (e != null) 
            Log.w(TAG, "Listen failed.", e);
            return;
        

        int count = 0;
        for (QueryDocumentSnapshot doc : value) 
            if (doc.getMetadata().hasPendingWrites()) 
                count++;
            
        
        Log.d(TAG, "count: "+ count);
    
);

【讨论】:

感谢 Alex,如何查询待处理状态的数量。 请检查我更新的答案并告诉我它是否有效。

以上是关于将本地 Firestore 缓存与服务器显式同步的主要内容,如果未能解决你的问题,请参考以下文章

Cloud Storage 是不是与 Firestore 同步离线工作

firestore在Android的哪里存储缓存?

同步服务实际上并未同步

离线缓存数据的 Firestore 定价说明

在 Android 上使用 Firestore 的缓存策略

如何将 indexedDB 本地数据与服务器同步?