Cloud Firestore:通过直接获取来检索缓存数据?

时间:2017-11-10 12:22:45

标签: android firebase google-cloud-firestore

从服务器检索数据可能需要几秒钟。有没有办法在此期间使用直接get?

检索缓存数据

只有在从服务器检索数据时才会调用onComplete

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

是否有缓存数据的回调?

3 个答案:

答案 0 :(得分: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:true

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

如果我使用听众:

    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:true

     

isFromCache:false

答案 1 :(得分:0)

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

  

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

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

示例:

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 :(得分:-1)

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