我正在构建一个Android应用程序,它必须离线工作数周,但可以在远程数据库上线时立即同步。
我的问题是,Firestore可以成为一个很好的选择吗? Firestore保留其脱机缓存多长时间?
答案 0 :(得分:6)
可以将Firestore配置为保留此类断开连接/脱机使用的数据。我建议您阅读文档中的enable offline persistence部分,其中包含启用此功能的示例:
FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder() .setPersistenceEnabled(true) .build(); db.setFirestoreSettings(settings);
这种持久性实际上默认在Android和iOS上启用,因此不需要上面的调用。
无论您是否已连接,与数据库交互的Android代码都是相同的,因为SDK的工作原理相同。如果要检测数据是否来自缓存(因此可能过时),请阅读文档中的Listen to offline data部分。
缓存中的数据在一定时间后不会过期。数据从缓存中删除的唯一原因是:
答案 1 :(得分:1)
如果您在Cloud Firestore中收听数据,您将立即获得缓存数据的快照,并在您的应用能够在线连接时进行更新:
final DocumentReference docRef = db.collection("cities").document("SF");
docRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(@Nullable DocumentSnapshot snapshot,
@Nullable FirebaseFirestoreException e) {
if (e != null) {
Log.w(TAG, "Listen failed.", e);
return;
}
// Determine if the data came from the server or from cache
String source = snapshot != null && snapshot.getMetadata().hasPendingWrites()
? "Local" : "Server";
// Read the data
if (snapshot != null && snapshot.exists()) {
Log.d(TAG, source + " data: " + snapshot.getData());
} else {
Log.d(TAG, source + " data: null");
}
}
});
默认情况下启用持久性,因此此行为不需要任何配置。
答案 2 :(得分:0)
以下答案遵循以下链接中的官方指南:
FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
.setCacheSizeBytes(FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED)
.build();
db.setFirestoreSettings(settings);
上面的代码为setCacheSize()设置了一个标志,这将阻止您的缓存 被清除。您也可以指定相同的大小。如果未默认设置,则大小为100MB。
根据指南,有一种方法可以检查您查询的数据是来自缓存还是来自Firestore。同样,当您的设备恢复在线状态时,firestore会刷新缓存并保持数据同步。
要回答您的问题,由于您必须处理离线数据数周,因此我建议每次获取数据以json / xml格式存储时,因为将大量数据存储在缓存中并不是一个很好的方法从性能方面考虑。
我希望我能帮助您清除一些东西。