【问题标题】:Google firebase check if child existsGoogle firebase 检查孩子是否存在
【发布时间】:2016-09-20 16:49:13
【问题描述】:

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

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

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

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

【问题讨论】:

标签: java android firebase firebase-realtime-database


【解决方案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

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

【讨论】:

  • 澄清一下:是否可以在没有监听器的情况下访问 firebase 上的数据?
  • 我假设你在问是因为你不希望回调一遍又一遍地运行。上面代码中的“single”表示这只触发一次。
  • 是的。非常感谢!
  • 如果DatabaseReference不存在onDataChange不调用,因为没有任何数据,调用方法onCancelled()
【解决方案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
    }
  }
});

【讨论】:

  • 我不能用snapshot.exists()吗?
  • 在向根节点添加侦听器时编写“rootRef.child("childName")”没有意义。你在发布之前测试过你的代码吗?
【解决方案3】:

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

// 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】:

    尝试将.childexists.equalTo("Your specific name") 结合使用

    【讨论】:

      【解决方案5】:
      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) {
      
                                      }
                                  });
      

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2016-09-18
          • 2017-02-25
          • 1970-01-01
          • 2017-10-24
          • 1970-01-01
          • 2022-01-15
          • 2019-09-15
          • 2011-11-25
          相关资源
          最近更新 更多