【发布时间】:2018-07-22 08:26:52
【问题描述】:
Firebase 可以离线工作,然后在线更新服务器。如何检查 Firestore 离线交易是否已更新到 Firebase 服务器?
我想在用户注销之前向他们显示警告,服务器未更新,如果他们注销将丢失数据。
【问题讨论】:
标签: java android firebase google-cloud-firestore
Firebase 可以离线工作,然后在线更新服务器。如何检查 Firestore 离线交易是否已更新到 Firebase 服务器?
我想在用户注销之前向他们显示警告,服务器未更新,如果他们注销将丢失数据。
【问题讨论】:
标签: java android firebase google-cloud-firestore
如何检查 Firestore 离线交易是否已更新到 Firebase 服务器?
你不能!来自official documentation:
客户端离线时交易会失败。
同样来自关于Enable offline data的官方文档:
对于 Android 和 iOS,默认启用离线持久化。
此功能会缓存您的应用正在使用的 Cloud Firestore 数据的副本,以便您的应用可以在设备离线时访问数据。您可以写入、读取、侦听和查询缓存的数据。当设备重新上线时,Cloud Firestore 会将您的应用所做的任何本地更改同步到远程存储在 Cloud Firestore 中的数据。 所以不会有数据丢失。
如果你想知道你获取数据的来源,你可以使用isFromCache()方法:
返回: 如果快照是从缓存数据而不是保证最新的服务器数据创建的,则为 true。如果您的听众选择了元数据更新(通过
MetadataChanges.INCLUDE),一旦客户端从后端收到最新数据,您将收到另一个isFomCache()等于false 的快照。
documentSnapshot.getMetadata().isFromCache();
【讨论】:
使用 hasPendingWrites 检查文档是否有待写入服务器。
使用 isFromCache 检查文档是从缓存中还是从服务器中检索到的。
db.collection("myobjs")
.get(Source.CACHE) // Change to Server if you want to load from server
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
if (document.getMetadata().isFromCache() == true) {
Log.d(TAG, document.getId() + " isFromCache => " + document.getData());
}
if (document.getMetadata().hasPendingWrites() == true) {
Log.d(TAG, document.getId() + " hasPendingWrites => " + document.getData());
}
}
Log.d(TAG, document.getId() + " offline => " + document.getData());
}
} else {
Log.w(TAG, "Error getting documents.", task.getException());
}
}
});
});
【讨论】: