Google firebase检查是否存在子级

时间:2016-05-23 17:35:27

标签: java android firebase firebase-realtime-database

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

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

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

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

6 个答案:

答案 0 :(得分:61)

编辑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)

答案 1 :(得分:2)

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

结合使用

答案 2 :(得分:1)

不要这样

从不

它将带走您所有的数据并带到设备上

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
    }
  }
});

答案 3 :(得分:1)

完整的解决方案。无需下载所有数据。只需检查孩子是否这样存在:

// 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?

    }

});

答案 4 :(得分:0)

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) {

                                }
                            });

答案 5 :(得分:0)

使用snapshot.exists()来检查引用的数据库条目是否包含子项,而不管该子项的值如何。

相关问题