Firestore:仅当有更新时才从服务器获取数据,否则从缓存中获取

时间:2020-04-25 08:31:25

标签: java android firebase google-cloud-firestore

我开始研究Firebase Firestore数据库以利用锁定时间。我创建了一个应用程序,其中在Firestore中拥有一些主数据存储和一些交易数据。现在,对于主数据,我目前这样获取

firestoreInstance.collection("makes-models")
            .whereEqualTo("type", "2W")
            .get()
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    makesListMutableLiveData.setValue(null);
                    Log.e(TAG, e.getMessage());
                }
            }).addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if(task.isSuccessful()) {
                        List<Make> makes = task.getResult().toObjects(Make.class);
                        makesListMutableLiveData.setValue(makes);
                    } else {
                        makesListMutableLiveData.setValue(null);
                        Log.e(TAG, task.getException().getMessage());
                    }
                }
            });

现在我想要的是,如果有任何修改,我应该只从服务器中获取数据,否则只能从CACHE中获取数据。根据文档,我读到有很多方法可以获取

  1. 仅来自缓存
  2. 仅来自服务器
  3. 检查服务器,如果由于网络问题而无法连接,请从本地获取。

我想要的是:

以某种方式知道后端数据是否有更新,如果是,则从服务器获取,否则从本地获取。我想到的一件事是使用自上次获取以来检查服务器的时间戳记并相应地工作,但这似乎开销太大,我认为必须有更好的方法。

2 个答案:

答案 0 :(得分:1)

在进行get()调用时,Firestore SDK将始终尝试从服务器获取数据,而不管数据是否更改。仅当设备离线时,您才可以从缓存中获取数据。但是,如果您尝试实时监听变化,请根据官方文档进行

初始状态可以直接来自服务器,也可以来自本地缓存。如果本地缓存中有可用状态,则首先将使用缓存的数据填充查询快照,然后在客户端了解服务器的状态时,使用服务器的数据进行更新。

换句话说,如果服务器说您没有新的添加/更新/删除的文档,则可以从缓存中获取数据。但是,关于the duration of time you can get the data from cache,您还需要注意其他事项:

此外,如果侦听器断开连接超过30分钟(例如,如果用户下线),则将向您收取读取费用,就像您发出了全新的查询一样。

Another possible charge might also come from

即使您执行的每个查询都没有返回结果,对于每次执行的查询,其最低读取费用为一个文档。

但是根据Firestore的设计,所有这些费用都是正常的。

答案 1 :(得分:1)

Firestore中没有条件get()。您概述的三种情况是唯一支持的情况。如果您想知道是否可以从服务器更改查询结果,则实际上需要查询服务器,并支付该查询的全部费用。

一些可行的替代方法是:

  • 让服务器使用某种推送通知将可能已更改的任何数据通知客户端。服务器将必须知道客户端感兴趣的文档,并且客户端仅需要根据需要提取那些文档。

  • 创建另一个文档,该文档保存感兴趣的集合中文档的最后更新时间。客户可以检查一个文档,看是否有什么变化,然后决定如何查询它们。

最重要的是,您将必须发明一种方法来指示客户端是否应在任何给定时刻查询缓存或服务器。