You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Firestore如何获取子集合userinfo中的字段值?

如何从Firestore子集合中获取用户信息

没问题!你的Firestore结构和代码思路是对的,只是在获取文档字段的步骤上需要调整一下。因为userinfo子集合里每个用户只有一个文档,所以我们只需要从返回的QuerySnapshot里取出第一个文档,再提取字段值就可以了。下面给你两种实现方式:

方式一:直接提取字段值

你可以先从QuerySnapshot中拿到第一个DocumentSnapshot实例,然后用getString()方法获取对应的字段。注意要先判断查询结果是否为空,避免空指针异常:

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) {
        // 检查是否有文档返回
        if (!queryDocumentSnapshots.isEmpty()) {
            // 获取第一个文档(因为每个用户只有一个userinfo文档)
            DocumentSnapshot doc = queryDocumentSnapshots.getDocuments().get(0);
            // 提取字段值
            String username = doc.getString("username");
            String email = doc.getString("email");
            
            // 这里就可以使用这两个变量了,比如赋值给全局变量或者更新UI
            // 注意:如果要赋值给外部的非final变量,需要用AtomicReference或者把逻辑写在这里
        } else {
            Toast.makeText(SettingsActivity.this, "未找到用户信息", Toast.LENGTH_SHORT).show();
        }
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception e) {
        Toast.makeText(SettingsActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
    }
});

方式二:使用UserInfo实体类映射

既然你已经定义了UserInfo实体类,我们可以用Firestore的toObject()方法直接把文档数据映射成实体对象,这样代码更简洁易维护:

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) {
        if (!queryDocumentSnapshots.isEmpty()) {
            DocumentSnapshot doc = queryDocumentSnapshots.getDocuments().get(0);
            // 直接映射为UserInfo对象
            UserInfo userInfo = doc.toObject(UserInfo.class);
            
            if (userInfo != null) {
                String username = userInfo.getUsername();
                String email = userInfo.getEmail();
                // 在这里使用变量
            }
        } else {
            Toast.makeText(SettingsActivity.this, "未找到用户信息", Toast.LENGTH_SHORT).show();
        }
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception e) {
        Toast.makeText(SettingsActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
    }
});

注意事项

  • Firestore的数据获取是异步操作,所以你不能在addOnSuccessListener外部直接使用username和email变量(除非用AtomicReference这类容器),最好在回调内部完成变量的使用逻辑(比如更新UI、存储到全局变量等)。
  • 确保UserInfo类的字段名和Firestore文档中的字段名完全一致(大小写也要匹配),否则toObject()会映射失败。

内容的提问来源于stack exchange,提问作者Lionlollipop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 10:07:31