我正在开发一个Android应用程序并使用Firebase来存储我的数据。我想查询firebase实例,以检查用户输入的电子邮件地址是否与Firebase中的某个电子邮件匹配。附加Firebase后端数据。
我的要求是,我想循环遍历"监护人" ,这是数据库实例的直接子项,并检查用户输入的电子邮件是否与任何一个匹配那个孩子的电子邮件地址。在附图中,如果用户输入的电子邮件匹配" ram@gmail.com"或者另一个,我想做点什么。
databaseReference = FirebaseDatabase.getInstance().getReference().child("guardians");
databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot data: dataSnapshot.getChildren()){
if (**I am unable to figure out how to search through entire guardians child for the email**) {
} else {
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
我无法弄清楚如何搜索整个监护人的孩子,看看该电子邮件是否与用户输入的电子邮件相符。任何帮助表示赞赏。提前谢谢。
答案 0 :(得分:0)
如果您使当前的方法有效(它是添加正确的if
声明的问题)您将下载整个用户列表,只是为了检查特定的电子邮件地址是否是正在使用。这非常浪费带宽,特别是当您的用户列表增长时。
您应该use a Firebase Database query只返回具有请求的电子邮件地址的用户:
databaseReference = FirebaseDatabase.getInstance().getReference().child("guardians");
Query query = databaseReference.orderByChild("guardianEmail").equalTo("guardian@example.com");
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
... the email address is already in use
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException(); // don't ignore errors
}
});
请确保guardianEmail
字段为add an index,否则您仍然会下载查询的所有数据。
请注意,此主题之前已经介绍了很多次,并且有更好的方法可以执行此检查。其中大部分涉及创建所谓的倒排索引,您可以使用用户的(编码)电子邮件地址作为密钥。使用该结构,您可以防止Firebase的服务器端安全规则中的重复,这甚至更有效。
有关此方法和其他方法的更多信息,请参阅: