Android Java 环境下如何从 Cloud Firestore 的 QuerySnapshot 中提取单个字段值
正确实现方案
报错的核心原因是task.getResult()返回的是QuerySnapshot类型(集合查询的结果快照),无法直接赋值给DocumentSnapshot类型变量。即使查询仅返回1条匹配文档,也需要先从QuerySnapshot的文档列表中取出单条文档实例再读取字段。
完整可运行代码如下:
db.collection("songs").whereEqualTo("email",userauth.getEmail()).get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>(){ @Override public void onComplete(@NonNull Task<QuerySnapshot> task) { if (task.isSuccessful()) { QuerySnapshot snapshot = task.getResult(); if (!snapshot.isEmpty()) { // 取第一条匹配的文档,你已确认仅返回1条结果可直接这么写 DocumentSnapshot document = snapshot.getDocuments().get(0); // 读取String类型的link字段,避免类型转换错误 String link = document.getString("link"); userinfo.setText(link); } } else { // 可按需添加查询失败的日志打印逻辑 Log.d("Firestore", "查询失败: ", task.getException()); } } });
Firestore 快照类型区别
QuerySnapshot:集合条件查询的返回结果,包含所有匹配查询条件的文档集合,无论匹配结果数量为0/1/多条,返回的都是该类型DocumentSnapshot:单条文档的快照,存储单条文档的所有字段数据,需要从QuerySnapshot的文档列表中读取,或者通过document()直接查询单条文档时返回该类型
可选优化方案
如果你的songs集合下的文档ID就是对应用户的邮箱,可直接查询单条文档,无需走集合条件查询,性能更高:
db.collection("songs").document(userauth.getEmail()).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() { @Override public void onComplete(@NonNull Task<DocumentSnapshot> task) { if (task.isSuccessful()) { DocumentSnapshot document = task.getResult(); if (document.exists()) { userinfo.setText(document.getString("link")); } } } });
内容的提问来源于stack exchange,提问作者user16931025
相关产品推荐
相关产品推荐

