Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Google firebase检查子项是否存在_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Java Google firebase检查子项是否存在

Java Google firebase检查子项是否存在,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,在我的应用程序中,我需要检查firebase上数据库的给定元素是否有具有给定名称的子元素。我希望可以通过以下方式实现: DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); if (rootRef.childExists("name")) { //run some code } 我搜索了,但找不到任何有用的东西。尝试将.childexists与.equalTo(“您的特定名称”)结合使用编

在我的应用程序中,我需要检查firebase上数据库的给定元素是否有具有给定名称的子元素。我希望可以通过以下方式实现:

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

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

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

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

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

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

如果你想在这里做验证,而不是控制流,你应该考虑把这个代码放在你的<代码>规则中。JSON < /代码> ./P>


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

不要这样做

从不

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

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

使用snapshot.exists()检查引用的数据库项是否包含子项,而不考虑子项的值

一个完整的解决方案。无需下载所有数据。只需检查孩子是否存在如下情况:

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

    }

});

可能的重复只是为了澄清:是否有可能在没有侦听器的情况下访问firebase上的数据?我假设您这样问是因为您不希望回调反复运行。上述代码中的“single”表示只触发一次。是。非常感谢!如果DatabaseReference不存在,则不会调用DataChange,因为没有任何数据,所以调用方法onCancelled()
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
    }
  }
});
// 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?

    }

});