Firebase 实时数据库通过 Email/Name 在 Android 和 Java 中获取用户
Firebase Realtime Database geting User by Email/Name in Android with Java
我想通过电子邮件或姓名获取用户或仅获取用户 UID。试图编写查询,但我正在获取所有用户,然后遍历他们,然后获取用户,但我认为这是一项昂贵的任务。我怎样才能从实时数据库中只获得一个 User/Uid?
这是我想出来的(但我认为这不是最好的方法):
DatabaseReference usersRef = FirebaseDatabase.getInstance().getReference("Users");
Query emailQuery = usersRef.orderByChild("email").equalTo(client.getEmail());
emailQuery.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot child : snapshot.getChildren()) {
if (child.getValue(User.class).getEmail().equals(client.getEmail())){
User user = child.getValue(User.class);
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
根据您最后的评论:
I have the corresponding details of each user (email, name), and I want to get the UID of one user (no matter which one)
要根据特定电子邮件地址从数据库中获取特定用户,您已经在使用的查询:
Query emailQuery = usersRef.orderByChild("email").equalTo(client.getEmail());
Returns 仅将字段 email
设置为 client.getEmail()
return 的用户。例如,如果 client.getEmail()
returns tedo@gmail.com 那么根据您的屏幕截图,您将得到一个结果,这是第一个。也就是说,以下 if 语句没有意义:
if (child.getValue(User.class).getEmail().equals(client.getEmail())){
User user = child.getValue(User.class);
}
既然用户节点的key是用UID表示的,那么应该这样获取:
Query emailQuery = usersRef.orderByChild("email").equalTo(client.getEmail());
emailQuery.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot child : snapshot.getChildren()) {
User user = child.getValue(User.class);
String uid = child.getKey();
//Do what you need to do with UID.
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Log.d("TAG", error.getMessage()); //Never ignore potential errors!
}
});
这是查询实时数据库的最简单、成本最低的方法,在这种方法中,您 return 仅查询您感兴趣且满足特定条件的元素。
我想通过电子邮件或姓名获取用户或仅获取用户 UID。试图编写查询,但我正在获取所有用户,然后遍历他们,然后获取用户,但我认为这是一项昂贵的任务。我怎样才能从实时数据库中只获得一个 User/Uid?
这是我想出来的(但我认为这不是最好的方法):
DatabaseReference usersRef = FirebaseDatabase.getInstance().getReference("Users");
Query emailQuery = usersRef.orderByChild("email").equalTo(client.getEmail());
emailQuery.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot child : snapshot.getChildren()) {
if (child.getValue(User.class).getEmail().equals(client.getEmail())){
User user = child.getValue(User.class);
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
根据您最后的评论:
I have the corresponding details of each user (email, name), and I want to get the UID of one user (no matter which one)
要根据特定电子邮件地址从数据库中获取特定用户,您已经在使用的查询:
Query emailQuery = usersRef.orderByChild("email").equalTo(client.getEmail());
Returns 仅将字段 email
设置为 client.getEmail()
return 的用户。例如,如果 client.getEmail()
returns tedo@gmail.com 那么根据您的屏幕截图,您将得到一个结果,这是第一个。也就是说,以下 if 语句没有意义:
if (child.getValue(User.class).getEmail().equals(client.getEmail())){
User user = child.getValue(User.class);
}
既然用户节点的key是用UID表示的,那么应该这样获取:
Query emailQuery = usersRef.orderByChild("email").equalTo(client.getEmail());
emailQuery.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot child : snapshot.getChildren()) {
User user = child.getValue(User.class);
String uid = child.getKey();
//Do what you need to do with UID.
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Log.d("TAG", error.getMessage()); //Never ignore potential errors!
}
});
这是查询实时数据库的最简单、成本最低的方法,在这种方法中,您 return 仅查询您感兴趣且满足特定条件的元素。