检查 firebase 实时数据库中是否存在某个字段

Checking for existence of a field in firebase real-time database

对于 firebase 函数,我们有时可能需要检查实时数据库中的某个字段是否存在,例如,我们可能会遍历实时数据库中的所有用户记录,而只有部分用户可能有一个字段,比如“汽车”。据我了解 ,我们可以调用 exists() 或检查 null.

第一个是检查 car 是否存在:

if(dataSnapshot.child("car").exists()) {
    //Do something
}

第二个是检查 car 字段是否为空:

if(dataSnapshot.child("car").val() != null) {
    //Do the other thing
}

问题是,这两种方式如何比较,首先,在结果上? exists() === falsenull 相同,exists() === true!null 相同,或者是否有任何特殊情况需要考虑?其次,性能如何?与 exists() 的函数调用相比,空检查是否更快,是否使用更少的资源(内存等)?还是纯粹是preference/taste的问题?

看看API源代码就可以找到答案。

让我们从 .exists() 方法开始。在 this link(第 361 行)处,您可以看到 exists 方法执行对基础 isEmpty() 方法的调用。

在同一个文件中,在第462行,我们可以看到val()方法的实现:它调用了内部节点的val()方法。好吧,让我们看一下:在 this link,第 197 行,您可以看到 val() 方法要做的第一件事就是调用 isEmpty() 方法,如果它为真, 它将 return 一个空值。

这告诉我们这两种方法(使用 exists() 或评估 val() 的 return 值并检查它是否为空)给出相同的结果。

让我们来看看性能方面:两种方式的性能相同。如果要集中调用这些方法,exists() 会执行较少的内部调用,因此它应该是首选。