【发布时间】:2020-11-23 23:51:50
【问题描述】:
Firestore 和 RTDB 在尝试在没有互联网的情况下收听时的行为非常不同。在 Internet 恢复之前,RTDB 不会触发任何侦听器。 Firestore 使用空快照触发侦听器,因此对 exists() 的调用返回 false。当互联网恢复时,Firestore 会再次使用实时数据触发。这是一个没有磁盘持久性的应用程序,并且在设置侦听器之前从未写入正在读取的字段/文档。
firestore 所做的事情会让事情变得非常混乱......可能无法判断数据是否真的不存在或其他地方出了问题。这是预期的行为吗?有什么办法可以解决这个问题吗?
//first firestore statement in the app
fs.collection("blabla").document("blabla").addSnapshotListener(new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(@Nullable DocumentSnapshot value, @Nullable FirebaseFirestoreException error)
{
if (error == null)
Log.v("TEST", "FS LISTEN EVENT " + value.exists() + " " + value.getData());
if (error != null)
Log.v("TEST", "FS LISTEN ERROR " + error);
}
});
Logcat:
V/TEST: FS LISTEN EVENT false null
互联网恢复后:
V/TEST: FS LISTEN ERROR com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: 权限缺失或不足。
编辑:
我现在已经测试了这个有没有坚持。至少在第一次获取此数据时具有相同的行为。因为我不打算使用磁盘持久性,所以每次创建活动时都会发生这种情况。
我可以使用 get() 代替快照侦听器 - 它返回一个不错的 com.google.firebase.firestore.FirebaseFirestoreException: 无法获取文档,因为客户端处于脱机状态。非常不同的行为。但我也对 get() 有所保留:
-
无法停止/注销它。所以我不能为此操作实现超时。它可以在应用程序暂停时触发 - 或在任何其他意外时刻。 firestore 没有 goOffline ......是的,我可以想出处理它的逻辑 - 虽然肯定很复杂......
-
从未得到关于冷火问题是否已解决的答案。有些人记录了 get() 获取数据的 90 秒。对于应用启动时需要的一些关键数据,并且无法实现超时 - 如何处理应用流?
【问题讨论】:
-
“在互联网恢复之前,RTDB 不会触发任何侦听器”这取决于您如何编写代码。没有看到您在 RTDB 中使用的代码,比较两个数据库是没有意义的,我建议您只提出关于 Firestore 的问题。
标签: android firebase firebase-realtime-database google-cloud-firestore