Google firebase检查是否存在子级

zom*_*bom 32 java android firebase firebase-realtime-database

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

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

if (rootRef.childExists("name")) {
    //run some code
}
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*din 64

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

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

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

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

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

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

  • 我假设你问,因为你不希望回调一遍又一遍地运行.上面代码中的"单个"意味着它只会触发一次. (2认同)
  • 如果没有调用DatabaseReference onDataChange没有调用,因为没有任何数据,称为方法onCancelled() (2认同)

Արս*_*յան 9

不要这样做

绝不

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

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

通过这种方式检查。如果存在,它将返回孩子的值,否则 -> 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
    }
  }
});
Run Code Online (Sandbox Code Playgroud)


Joh*_*n T 5

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

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

    }

});
Run Code Online (Sandbox Code Playgroud)