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 仅查询您感兴趣且满足特定条件的元素。