如何从已登录的用户检索和显示数据-Firestore

时间:2019-05-22 03:59:54

标签: android firebase google-cloud-firestore

我正在尝试获取并显示用户登录时的信息。(例如:姓名,电子邮件,电话)

我尝试了在YouTube和堆栈溢出中找到的多个代码段,但它们均失败了。大多数教程使用实时数据库,这不是我想要的。

我也尝试过制作一个“用户”对象。

private void getData(){
        FirebaseFirestore db = FirebaseFirestore.getInstance();

        db.collection("users")
                //.document(FirebaseAuth.getInstance().getCurrentUser().getUid())
                .whereEqualTo("email:", FirebaseAuth.getInstance().getCurrentUser().getUid())
                .get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()) {
                            for (DocumentSnapshot document : task.getResult()) {
                                //Toast.makeText(getApplicationContext(),document.getId() +"==>" + document.getData(),Toast.LENGTH_LONG).show();
                                //Toast.makeText(getApplicationContext(),""+ document.get("Email") ,Toast.LENGTH_LONG).show();

                                nameEdt.setText((CharSequence) document.get("First Name"));
                                emailEdt.setText((CharSequence) document.get("Email"));
                                phoneEdt.setText((CharSequence) document.get("Phone"));


                            }
                        } else {
                            Toast.makeText(getApplicationContext(),"No such document",Toast.LENGTH_LONG).show();
                        }
                    }
                });
    }

数据库结构: db structure

我了解firestore中的文档与用户无关,但是我不知道如何设置代码,以使其仅从已登录的用户中检索数据* 新创建的帐户,但是如果我要注销并使用其他用户登录,则不会更新“帐户/用户信息”。

简而言之,我如何从已登录的用户访问和显示我的数据库信息?

附加说明:我正在使用电子邮件和密码进行身份验证

2 个答案:

答案 0 :(得分:3)

要访问存储在Firestore中的用户数据,它应该没有您想象的那么复杂,不需要查询,您只需要获取与用户uid相对应的文档,并获取特定字段或执行任何操作即可需要他们,像这样:

db.collection("users").document(FirebaseAuth.getInstance().getCurrentUser().getUid())
        .get().addOnCompleteListener(task -> {
    if(task.isSuccessful() && task.getResult() != null){
        String firstName = task.getResult().getString("First Name");
        String email = task.getResult().getString("Email");
        String phone = task.getResult().getString("Phone");
        //other stuff
    }else{
        //deal with error
    }
});

原始答案

用户信息未存储在Firestore数据库中,它们与您为登录设置的Firebase身份验证相关联。要检索相关的用户信息,您需要使用相关的FirebaseAuth API。使用它来检索当前登录用户:

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

然后,您可以使用以下内容获取名称和电子邮件地址:

String name = user.getDisplayName();
String email = user.getEmail();

有关更多信息,请参阅documentation


如果FirebaseAuth无法解析,则可能意味着您未正确遵循设置指南,并忘记了在gradle文件中包含依赖项:

implementation 'com.google.firebase:firebase-auth:17.0.0'

答案 1 :(得分:0)

经过几天的努力,我试图找到一种解决方案,然后发现了一种能够从数据库中检索用户信息的解决方案。但是,需要特别注意的是,由于我的应用程序未保存大量数据,因此该结构对我有用。

因此,我基本上是在正确的轨道上,但是由于对火力基础缺乏理解,我错过了一些概念。

    private void getData(){
        FirebaseFirestore db = FirebaseFirestore.getInstance();
        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
        final String current = user.getUid();//getting unique user id

        db.collection("users")
                .whereEqualTo("uId",current)//looks for the corresponding value with the field
                // in the database
                .get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()) {
                            for (DocumentSnapshot document : task.getResult()) {

                                nameEdt.setText((CharSequence) document.get("firstName"));
                                emailEdt.setText((CharSequence) document.get("email"));
                                phoneEdt.setText((CharSequence) document.get("phone"));
                                // These values must exactly match the fields you have in your db

                            }
                        } 

如前所述,文档不与用户关联,但是您可以通过在数据库中创建一个名为“无论您想要什么”的字段来将它们链接在一起(我将其设为uId)。这是因为Firebase在通过身份验证时会为每个用户生成一个唯一的ID。通过创建包含该唯一ID的字段,您可以检索该集合中的关联信息。

bd struc

如何创建字段: 我创建了一个“用户”对象,该对象将从我的编辑文本中获取uid。在我的代码中,无论我在哪里创建/验证新用户/帐户,都将uid传递给它。

FirebaseUser testUser = FirebaseAuth.getInstance().getCurrentUser(); //getting the current logged in users id
                            String userUid = testUser.getUid();                       
                            String uidInput = userUid;

User user = new User(firstNameInput,lastNameInput,uidInput);

 db.collection("users").document(userUid)
                                    .set(user)
                                    .addOnSuccessListener(new OnSuccessListener<Void>() {

注意:我相信您也可以将其添加到哈希映射中。