Fra*_*len 6
首先:请记住,Firebase 实时数据库最适合用于通过使用长期监听器在客户端和数据库服务器之间(或多个客户端之间)保持数据同步。在 Android 上addValueEventListener
,您可以使用 来执行此操作,您应该尽可能尝试使用它。
但在某些情况下,您只希望从数据库中读取一个值一次。那么让我们看看我是否可以依次回答这些问题,从最重要的一个开始:
当我想从数据库中读取一次值时应该使用哪种方法?
如果您只需要从数据库中读取值一次,请使用新get()
方法。
在 Java 中看起来像这样:
ref.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
@Override
public void onComplete(@NonNull Task<DataSnapshot> task) {
if (!task.isSuessful()) {
Log.e("firebase", "Error getting data", task.getException());
}
else {
Log.d("firebase", String.valueOf(task.getResult().getValue()));
}
}
});
在 Kotlin 中,它是:
ref.get().addOnSuessListener {
Log.i("firebase", "Got value ${it.value}")
}.addOnFailureListener{
Log.e("firebase", "Error getting data", it)
}
为什么你推荐使用get()
whenaddListenerForSingleValueEvent
被提及得更多?
我们addListenerForSingleValueEvent
在我们的第一个 Android SDK 中引入了它,从那时起它就一直存在。这些年写了很多教程,也提出了很多问题,也解答了很多问题。
我们当然正在更新文档。但是我们无法更新所有教程。因此,在可预见的未来,提及addListenerForSingleValueEvent
新get()
方法的次数将多于提及。
之间有什么区别get()
和addListenerForSingleValueEvent
?
如前所述:该addListenerForSingleValueEvent
方法自存在以来一直是 Firebase Android SDK 的一部分,并用于从数据库中读取一次值。它通过以下方式做到这一点:
addValueEventListener
等待值从持久层显示出来
打电话 onDataChange
移除监听器
这非常有效……直到我们在 SDK 2.0 版中引入了磁盘缓存(早在 I/O 2015)。在此之前,第 2 步中的所有值将始终来自服务器,因为客户端已经有一个侦听器,或者因为这会将第一个侦听器附加到服务器。但是对于磁盘缓存,如果您之前读取过该值但当前没有侦听器,则步骤 2 将从磁盘缓存中读取该值,并且您onDataChange
将立即使用该值调用您。即使服务器上的值已经更新。实际上,在幕后,侦听器将更新磁盘缓存中的值,但只有在使用缓存中onDataChange
的(可能是陈旧的)值调用您之后。
虽然可以解释这种行为,但它几乎不是任何人想要的。不幸的是,我们发现这种边缘情况为时已晚,无法将其归类为简单的实现错误并进行修复。所以我们保留了它,并建议人们要么使用磁盘持久性要么使用addListenerToSingleValueEvent
,但不能同时使用。或者您可以调用keepSynced(true)
相同的参考/查询作为解决方法。都是乱七八糟的,不好。
快进 5 年多,我们终于推出了一种不再有这种尴尬行为的新方法。而且由于 Android API 自 2015 年以来发生了相当大的变化,我们还使用了(稍微)更现代的方法签名:Task<DataSnapshot> get()
.
更多推荐
有什么区别,addListenerForSingleValueEvent
发布评论