谷歌火库检查子是否存在

在我的应用程序中,我需要检查firebase上数据库的给定元素是否有具有给定名称的子元素。我希望可以通过使用如下内容来完成:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();

if (rootRef.childExists("name")) {
    //run some code
}

我搜索了一下,但我找不到任何有用的东西。


答案 1

编辑2;值得放在上面:我认为值得一提的是,这实际上是在此快照上下载所有数据,只是为了检查是否存在任何数据。你应该注意这里。如果引用很大(例如,实际上是根引用而不是特定的子/属性),那么您应该找到一个更深的节点,您可以使用它来检查是否存在,或者以不同的方式设计数据结构,以便进行有效的检查。

数据库引用实际上是该数据的 URL。您希望实际获取数据以查看子项是否存在。这就是为什么您似乎正在寻找的方法在DataSnapshot上的原因。

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  void onDataChange(DataSnapshot snapshot) {
    if (snapshot.hasChild("name")) {
      // run some code
    }
  }
});

现在,这种设计模式感觉有点奇怪。您正在读取整个数据库,只是为了查看“名称”是否存在。您可以通过收听然后检查是否.rootRef.child("name")snapshot.exists()

如果您尝试在此处执行验证,而不是控制流,则应考虑将此代码放在 .rules.json

编辑:我最初使用了错误的函数名称(childExists而不是hasChild)


答案 2

不要像这样做

从不

它将获取您的所有数据并带到设备

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  void onDataChange(DataSnapshot snapshot) {
    if (snapshot.hasChild("name")) {
      // run some code
    }
  }
});

通过这种方式检查它。如果存在,它将返回子项的值,否则 -> null

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.child("childName")
rootRef.addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  void onDataChange(DataSnapshot snapshot) {
    if (snapshot.getValue() == null) {
      // The child doesn't exist
    }
  }
});

推荐