Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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
Android 如何在FirebaseDatabase中执行搜索? 描述_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android 如何在FirebaseDatabase中执行搜索? 描述

Android 如何在FirebaseDatabase中执行搜索? 描述,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我的Firebase NoSQL数据库应该看起来像这样: 只要有新用户登录,就应该推送用户Java模型 问题 如何检查具有电子邮件地址的用户是否已拥有帐户?由于电子邮件地址位于:Root>PushID>email;推送ID是自动生成的,我不知道如何在所有推送ID上迭代,并检查其中是否有电子邮件密钥设置为指定值 我已经阅读了文档,但不知道如何解决这个问题 从Shubhank的回答中学习 涉及子级的Firebase方法可应用于其任何子级,而不考虑其在层次结构中的级别,即不限于直接子级 在这个问题中

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

只要有新用户登录,就应该推送用户Java模型

问题 如何检查具有电子邮件地址的用户是否已拥有帐户?由于电子邮件地址位于:Root>PushID>email;推送ID是自动生成的,我不知道如何在所有推送ID上迭代,并检查其中是否有电子邮件密钥设置为指定值

我已经阅读了文档,但不知道如何解决这个问题

从Shubhank的回答中学习 涉及子级的Firebase方法可应用于其任何子级,而不考虑其在层次结构中的级别,即不限于直接子级


在这个问题中,要搜索的子级比公共父级低2级。第一级子级可以忽略,查询方法可以直接应用于目标子级。

您应该首先为用户创建一个模型类

class User { 
    public String email;
    public String name;
}
然后从数据库中获取用户并将其映射到用户对象中

  • 通过所有结果查询进行简单循环

    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());
          }
       });
    
  • 仅搜索特定值 在本例中,我们使用
    orderByChild
    equalTo
    方法将结果限制为特定的子值

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

  • 您应该首先为用户创建一个模型类

    class User { 
        public String email;
        public String name;
    }
    
    然后从数据库中获取用户并将其映射到用户对象中

  • 通过所有结果查询进行简单循环

    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());
          }
       });
    
  • 仅搜索特定值 在本例中,我们使用
    orderByChild
    equalTo
    方法将结果限制为特定的子值

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

  • 也许你用的是FireBase的认证系统?它可以为您处理所有的事情。这种方法对于这个特定的问题来说是可以的,但是我想知道,如果这是针对用户登录以外的其他问题,那么该如何解决呢?也就是说,在FirebaseDatabase中执行类似搜索的操作的一般方式。此外,我想存储属于某个用户的其他详细信息,这些信息未存储在身份验证系统中,因此我需要将每个用户作为子用户存储在我的数据库中。您是否可以使用FireBase的身份验证系统?它可以为您处理所有的事情。这种方法对于这个特定的问题来说是可以的,但是我想知道,如果这是针对用户登录以外的其他问题,那么该如何解决呢?也就是说,在FirebaseDatabase中执行类似搜索的操作的一般方式。此外,我想存储属于某个用户的其他详细信息,这些信息没有存储在身份验证系统中,因此我需要将每个用户作为子用户存储在我的数据库中。还有其他方法吗?类似于执行查询,而不是获取所有子项并在Java代码中迭代它们以查找匹配项。实际上,您可以使用orderBy并将结果限制为10个值,以便在服务器端执行查询。过一会儿我将试着编一个例子。您可以在这里阅读,直到那时,使用数据库引用上的orderByChild,我们可以基于任何子级对结果集进行排序,而不依赖于其在层次结构中的位置?在这种情况下,它比用户端点低两个级别,推送ID介于两者之间。还没有用这么多嵌套对其进行测试,但您肯定应该避免这样做,因为这样会减慢查询速度,因为将有更多数据需要匹配,从而产生性能问题。还有其他方法吗?类似于执行查询,而不是获取所有子项并在Java代码中迭代它们以查找匹配项。实际上,您可以使用orderBy并将结果限制为10个值,以便在服务器端执行查询。过一会儿我将试着编一个例子。您可以在这里阅读,直到那时,使用数据库引用上的orderByChild,我们可以基于任何子级对结果集进行排序,而不依赖于其在层次结构中的位置?在本例中,它比用户端点低两个级别,推送ID介于两者之间。没有使用这么多嵌套对其进行测试,但您肯定应该避免这样做,因为这样会减慢查询速度,因为将有更多数据需要匹配,从而产生性能问题。