Android 如何在FirebaseDatabase中执行搜索? 描述
我的Firebase NoSQL数据库应该看起来像这样: 只要有新用户登录,就应该推送用户Java模型 问题 如何检查具有电子邮件地址的用户是否已拥有帐户?由于电子邮件地址位于:Root>PushID>email;推送ID是自动生成的,我不知道如何在所有推送ID上迭代,并检查其中是否有电子邮件密钥设置为指定值 我已经阅读了文档,但不知道如何解决这个问题 从Shubhank的回答中学习 涉及子级的Firebase方法可应用于其任何子级,而不考虑其在层次结构中的级别,即不限于直接子级Android 如何在FirebaseDatabase中执行搜索? 描述,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我的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介于两者之间。没有使用这么多嵌套对其进行测试,但您肯定应该避免这样做,因为这样会减慢查询速度,因为将有更多数据需要匹配,从而产生性能问题。