java - Android:从子集合中获取字段值

标签 java android firebase google-cloud-firestore

有没有办法从子集合中获取数据?下面是我的数据库的结构,对于每个用户,只会在“userinfo”子集合中创建一个文档来存储用户名和电子邮件。

我试图从 Firestore 获取“用户名”和“电子邮件”值,然后将这些值设置为如下字符串:

字符串用户名 = ? 字符串电子邮件 = ?

"main"(root_collection)
            |
            |=>userid1(auto-generated)
                         |                  
                         |=>"userinfo"(sub-collection)=>documentID(auto)=>username: mary
                         |                                              =>email:mary@gmail.com
                         |                                             
                         |                            
                         |=>"emotions"(sub-collection)=>documentID(auto)=>happy: true
                                                                        =>sad:false
                                                                        =>depressed:false

我从其他问题中读到了一些其他答案,说可以使用

检索字段值
String value = documentSnapshot.getString("field");

但是我还是不知道怎么办?我写了一些东西,但我不知道如何获取值。

 FirebaseAuth mAuth = FirebaseAuth.getInstance();
        String userId = Objects.requireNonNull(mAuth.getCurrentUser()).getUid();

        FirebaseFirestore db = FirebaseFirestore.getInstance();
        CollectionReference userRef = db.collection("main").document(userId).collection("userinfo");

        userRef.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                //get the value
                String value = queryDocumentSnapshots.getDocuments("username"); // how ??
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(SettingsActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
            }
        });

还有一个对象类 UserInfo

import java.io.Serializable;

public class UserInfo implements Serializable {

    private String email, username;

    public UserInfo() {}

    public UserInfo(String email, String username) {
        this.email = email;
        this.username = username;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}

请帮忙,非常感谢。

最佳答案

Is there a way to get data from sub-collection?

是的,有。要获取该数据,您必须循环访问结果,如以下代码行所示:

userRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            for (QueryDocumentSnapshot document : task.getResult()) {
                String value = document.getString("username");
                Log.d("TAG", value);
            }
        } else {
            Log.d(TAG, "Error getting documents: ", task.getException());
        }
    }
});

logcat 中的结果将是:

mary

关于java - Android:从子集合中获取字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61119106/

相关文章:

android - "?android:attr/activatedBackgroundIndicator"是如何工作的?

基于 Firebase firestore 时间戳的安全规则

java - 如何修改代码以在菜单中添加退出选项并保持循环直到被调用?

java - 如何解决从 GCS 下载加密文件时出错的问题

java - 如何在netbeans中使用servlet和jsp根据第一个下拉列表中的类别选择在下拉列表中显示相关子类别?

swift - 如何允许用户使用 firebase 中的任何电子邮件地址进行访问?

swift - 无法在 Swift 3 中将 Facebook 用户属性传递给 Firebase FIRAuth

java - 尝试使用 FireBase 查看 Activity 中的 "Followers"和 "Following"时出现 NullPointerException

android - 一个 ScrollView 只能有一个 child

android - Google 云端硬盘范围已弃用?