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
相关产品推荐
相关产品推荐

