如何在 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;
}
然后从数据库中获取用户并将它们映射到用户对象中
简单循环遍历所有结果查询
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 NoSQL 数据库应该看起来像这样:
只要新用户登录,用户 Java 模型就会被推送。
问题
如何查看该邮箱地址的用户是否已有账户?由于电子邮件地址位于:Root > PushID > email;并且推送 ID 是自动生成的,我不确定如何迭代所有推送 ID 并检查是否有任何一个将其电子邮件密钥设置为指定值。
我已经阅读了文档,但无法弄清楚如何解决这个问题。
从 Shubhank 的回答中学习
涉及 child 的 Firebase 方法可以应用于其任何 children,无论其在层次结构中的级别如何,即不限于直接 child ren.
在这个问题中,要搜索的 child 比普通 parent 低 2 级。第一级child可以忽略,直接在目标child.
上应用查询方法你应该先为用户
制作一个模型classclass 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()); } });