Google firebase 检查 child 是否存在

Google firebase check if child exists

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

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

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

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

尝试将 .childexists.equalTo("Your specific name")

结合使用

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

数据库引用实际上是该数据的 URL。您想实际 获取 数据以查看 child 是否存在。这就是为什么您似乎正在寻找的方法在 DataSnapshot.

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

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

来提高效率

如果你想在这里做 验证,而不是控制流程,你应该考虑把这段代码放在你的 rules.json.

edit: 原来我用错了函数名(childExists 而不是hasChild)

UsersRef = FirebaseDatabase.getInstance().getReference();   
Users.addListenerForSingleValueEvent(new ValueEventListener() {
                                @Override
                                public void onDataChange(DataSnapshot snapshot) {
                                    if (snapshot.hasChild("childName")) {

                                        // it exists!
                                    }else{
                                       // does not exist
                                    }
                                }

                                @Override
                                public void onCancelled(@NonNull DatabaseError databaseError) {

                                }
                            });

不要这样

从不

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

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

这样检查。 如果存在,它将 return child 的值,否则 -> 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
    }
  }
});

使用 snapshot.exists() 检查引用的数据库条目是否包含子项,无论子项的值如何。

一个完整的解决方案。无需下载所有数据。只需检查 child 是否存在,如下所示:

// Assuming the names are in the name node. Remove "name/" if not
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference("name/" + name);
rootRef.addListenerForSingleValueEvent(new ValueEventListener() {

    @Override
    public void onDataChange(DataSnapshot snapshot) {
         if (snapshot.exists()) {
             // Exist! Do whatever.

         } else {
             // Don't exist! Do something.

         }
    }

    @Override
    public void onCancelled(DatabaseError error) {
        // Failed, how to handle?

    }

});