从服务器检索数据可能需要几秒钟。有没有办法在此期间使用直接get?
检索缓存数据只有在从服务器检索数据时才会调用onComplete
:
db.collection("cities").whereEqualTo("state", "CA").get()
.addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
...
}
}
});
是否有缓存数据的回调?
答案 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()