如何在 FirebaseDatabase 中执行搜索?

How to perform search in a FirebaseDatabase?

描述

我的 Firebase NoSQL 数据库应该看起来像这样:

只要新用户登录,用户 Java 模型就会被推送。

问题

如何查看该邮箱地址的用户是否已有账户?由于电子邮件地址位于:Root > PushID > email;并且推送 ID 是自动生成的,我不确定如何迭代所有推送 ID 并检查是否有任何一个将其电子邮件密钥设置为指定值。

我已经阅读了文档,但无法弄清楚如何解决这个问题。

从 Shubhank 的回答中学习

涉及 child 的 Firebase 方法可以应用于其任何 children,无论其在层次结构中的级别如何,即不限于直接 child ren.

在这个问题中,要搜索的 child 比普通 parent 低 2 级。第一级child可以忽略,直接在目标child.

上应用查询方法

你应该先为用户

制作一个模型class
class User { 
    public String email;
    public String name;
}

然后从数据库中获取用户并将它们映射到用户对象中

  1. 简单循环遍历所有结果查询

    FirebaseDatabase database = FirebaseDatabase.getInstance();
    
    // i don't know the end point since you have not specified it in the image           
    database.getReference("myUsersEndPoint").addListenerForSingleValueEvent(
                new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                      for (DataSnapshot data : dataSnapshot.getChildren()) {
                          User user = data.getValue(User.class);
                          if (myField.getText().toString().eqaulsIgnoreCase(user.email)) {
                            // exist
                          }
                      }
    
                   }
    
          @Override
          public void onCancelled(DatabaseError databaseError) 
                    Log.w("MyApp", "getUser:onCancelled", databaseError.toException());
          }
       });
    
  2. 仅搜索特定值 在此示例中,我们使用 orderByChildequalTo 方法将结果限制为特定子值

    FirebaseDatabase database = FirebaseDatabase.getInstance();
    
    // i don't know the end point since you have not specified it in the image           
    database.getReference("myUsersEndPoint").orderByChild("email").equalTo("emailToSearchhere").addListenerForSingleValueEvent(
                new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                      for (DataSnapshot data : dataSnapshot.getChildren()) {
                          // here the user will have the specified email only 
                      }
    
                   }
    
          @Override
          public void onCancelled(DatabaseError databaseError) 
                    Log.w("MyApp", "getUser:onCancelled", databaseError.toException());
          }
       });