【问题标题】:Cloud Firestore: retrieving cached data via direct get?Cloud Firestore:通过直接获取检索缓存数据?
【发布时间】:2017-11-10 12:22:44
【问题描述】:

从服务器检索数据可能需要几秒钟。有没有办法同时使用直接get来检索缓存的数据?

onComplete 似乎只有在从服务器检索数据时才被调用:

db.collection("cities").whereEqualTo("state", "CA").get()
        .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                if (task.isSuccessful()) {
                ...
                }
            }
        });

缓存数据有回调吗?

【问题讨论】:

  • 如果数据可以从缓存中获取,你可以通过:firebase.google.com/docs/firestore/manage-data/…然后检查querySnapshot.getMetadata().isFromCache()
  • 另外提一下,如果缓存不包含特定文档的数据,或者该文档不存在,get调用会返回错误。
  • @FrankvanPuffelen 据我了解,这样的例子使用了一个监听器。是否也可以通过直接获取来做到这一点?
  • 是的,并且在页面底部 Frank 的链接中也提到了,“查询与离线持久性一起工作。您可以使用直接获取或通过侦听来检索查询结果,如前几节。”。所以请参阅官方文档的前面部分。
  • 唯一的例子是使用addSnapshotListener 而不是直接获取。如果您知道如何通过直接获取来实现,请您发布一个sn-p吗?谢谢

标签: android firebase google-cloud-firestore


【解决方案1】:

现在可以仅从缓存版本加载数据。来自docs

您可以在 get() 调用中指定源选项以更改默认行为.....您只能从离线缓存中获取。

如果失败,您可以再次尝试在线版本。

例子:

DocumentReference docRef = db.collection("cities").document("SF");

// Source can be CACHE, SERVER, or DEFAULT.
Source source = Source.CACHE;

// Get the document, forcing the SDK to use the offline cache
docRef.get(source).addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        if (task.isSuccessful()) {
            // Document found in the offline cache
            DocumentSnapshot document = task.getResult();
            Log.d(TAG, "Cached document data: " + document.getData());
        } else {
            Log.d(TAG, "Cached get failed: ", task.getException());
            //try again with online version
        }
    }
});

【讨论】:

    【解决方案2】:

    我刚刚在一个 Android 应用中运行了一些测试,看看它是如何工作的。

    无论你是从缓存中获取数据还是从网络中获取数据,你需要的代码都是一样的:

        db.collection("translations").document("rPpciqsXjAzjpComjd5j").get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                DocumentSnapshot snapshot = task.getResult();
                System.out.println("isFromCache: "+snapshot.getMetadata().isFromCache());
            }
        });
    

    当我在线时会打印:

    isFromCache: false

    当我离线时,它会打印:

    isFromCache: 真

    当您连接到服务器时,无法强制从缓存中检索。

    如果我使用监听器:

        db.collection("translations").document("rPpciqsXjAzjpComjd5j").addSnapshotListener(new DocumentListenOptions().includeMetadataChanges(), new EventListener<DocumentSnapshot>() {
                @Override
                public void onEvent(DocumentSnapshot snapshot, FirebaseFirestoreException e) {
                    System.out.println("listen.isFromCache: "+snapshot.getMetadata().isFromCache());
                }
            }
        );
    

    我在线时会打印两张照片:

    isFromCache: 真

    isFromCache: false

    【讨论】:

    • 即使有互联网连接,也可以从缓存中获取数据非常有用,因为从服务器获取数据需要几秒钟。
    • 同意。但目前还没有这样的 API。如果您关心速度,我建议您附加一个监听器。
    • 我认为这个问题可以通过在 API 中添加一个标志来解决,比如 onlyFetchFromCache(true) 这样服务器就不会被击中,开发人员可以实现我的目标。目前我处于一个场景中,我在 firebase 有一些静态数据,我想获取它一次,应用程序应该保持在线,并且这个获取应该只在用户打开应用程序时发生一次我希望它只获取数据首先安装/打开。之后我想一直从缓存中读取它。
    • 对不起,我猜下面的答案有解决办法。
    【解决方案3】:

    您可以禁用网络访问并运行查询以访问缓存中的数据。 对于火库: https://firebase.google.com/docs/firestore/manage-data/enable-offline#disable_and_enable_network_access 对于 firebase 数据库调用 db.goOffline()db.goOnline()

    【讨论】:

      猜你喜欢
      • 2020-06-07
      • 2023-03-09
      • 2017-03-29
      • 1970-01-01
      • 2018-03-29
      • 2020-12-18
      • 2020-07-15
      • 2019-08-16
      相关资源
      最近更新 更多