我目前正在将 Firebase Firestore 用于 Android 项目,但当手机处于飞行模式时,我在检索数据时遇到一些问题。这是我的代码:
public void loadThings() {
FirebaseFirestore db = FirebaseFirestore.getInstance();
db.collection("medidas").whereEqualTo("id_user", mAuth.getCurrentUser().getUid()).get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
QuerySnapshot snapshot = task.getResult();
int tam = snapshot.getDocuments().size();
data = new String[tam];
StringBuilder temp;
DocumentSnapshot doc;
for (int i = 0; i < tam; i++) {
temp = new StringBuilder();
doc = snapshot.getDocuments().get(i);
temp.append("Date: ").append(doc.get("fecha")).append(";");
temp.append("Min: ").append(doc.get("min")).append(";");
temp.append("Max: ").append(doc.get("max")).append(";");
temp.append("Avg: ").append(doc.get("avg")).append(";");
data[i] = temp.toString();
}
if(tam==0)
{
noMeasures();
}
}
else
{
data=null;
}
mLoadingIndicator.setVisibility(View.INVISIBLE);
mMeasuresAdapter.setMeasuresData(data);
if (null == data) {
showErrorMessage();
} else {
showMeasuresDataView();
}
}
});
}
具体问题是,有时显示数据需要很长时间(超过10秒),而另一些则立即显示数据。由于手机处于飞行模式,显然我正在检索的数据来自缓存。但是,我不明白为什么有时要花这么长时间。有没有什么方法可以明确告诉 firestore 从缓存中获取数据,而不是尝试从服务器中获取数据?提前致谢
有没有什么方法可以明确告诉 firestore 从缓存中获取数据,而不是尝试从服务器中获取数据?
是的,是的,从16.0.0
SDK版本更新,您可以借助DocumentReference.get(源码源码) https://firebase.google.com/docs/reference/android/com/google/firebase/firestore/DocumentReference.html#get(com.google.firebase.firestore.Source) and Query.get(源码源码) https://firebase.google.com/docs/reference/android/com/google/firebase/firestore/Query.html#get(com.google.firebase.firestore.Source)方法。
默认情况下,get()
通过等待来自服务器的数据,尝试在可能的情况下提供最新数据,但如果您处于脱机状态且无法访问服务器,则可能会返回缓存的数据或失败。可以通过 Source 参数更改此行为。
所以你可以作为参数传递给DocumentReference
或到Query
源,因此我们可以强制从server only
, chache only
或尝试服务器并回退到缓存。
所以代码可能如下所示:
FirebaseFirestore db = FirebaseFirestore.getInstance();
DocumentReference docIdRef = db.collection("yourCollection").document("yourDocument");
docIdRef.get(Source.CACHE).addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
//Get data from the documentSnapshot object
}
});
在这种情况下,我们强制从CACHE
仅有的。如果你想强制从SERVER
只是,您应该将其作为参数传递给get()
方法,Source.SERVER
。更多信息here https://firebase.google.com/docs/reference/android/com/google/firebase/firestore/Source.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)