如何读取嵌套集合中的所有对象?文档采用UUID随机命名
读取嵌套集合中全部对象的实现
需求与数据结构
- 需求:读取嵌套集合中的全部对象,所有文档均以随机UUID命名
- 数据结构:
USER(集合)→UUID(文档)→OBJECTS(集合)→UUID(文档)→ 目标对象

已编写的Kotlin代码
db.collection("USER").document(//RANDOM UUID).collection("Objekte").get().addOnSuccessListener{ result-> listHouses = ArrayList() progressDialog.dismiss() for(document in result.documents) { val house = document.toObject(Houses::class.java) listHouses.add(house!!) } var viewPager2 = view?.findViewById<ViewPager2>(R.id.viewPagerHome) myAdapter = CustomAdapter(myCtx,listHouses) viewPager2?.adapter = myAdapter }
代码问题与修正
上述代码仅能读取单个USER文档下的Objekte集合数据,无法实现读取所有USER文档下全部对象的需求。要遍历所有USER文档并获取其下Objekte集合的全部数据,需要嵌套异步查询:
// 初始化集合存储所有对象 listHouses = ArrayList() progressDialog.show() // 第一步:遍历USER集合的所有文档 db.collection("USER").get().addOnSuccessListener { userDocs -> // 统计需要处理的USER文档数量,用于判断是否全部查询完成 val totalUsers = userDocs.size() var completedQueries = 0 for (userDoc in userDocs) { // 第二步:获取当前USER文档下的Objekte集合 userDoc.reference.collection("Objekte").get().addOnSuccessListener { objDocs -> for (objDoc in objDocs) { val house = objDoc.toObject(Houses::class.java) house?.let { listHouses.add(it) } } // 每完成一个USER下的Objekte查询,计数加1 completedQueries++ // 所有查询完成后更新UI if (completedQueries == totalUsers) { progressDialog.dismiss() val viewPager2 = view?.findViewById<ViewPager2>(R.id.viewPagerHome) myAdapter = CustomAdapter(myCtx, listHouses) viewPager2?.adapter = myAdapter } }.addOnFailureListener { e -> // 处理单个Objekte查询失败的情况 completedQueries++ if (completedQueries == totalUsers) { progressDialog.dismiss() // 可添加失败提示逻辑 } } } }.addOnFailureListener { e -> // 处理USER集合查询失败的情况 progressDialog.dismiss() // 可添加失败提示逻辑 }
关键说明
- 采用嵌套异步查询:先获取所有USER文档,再逐个查询每个USER下的
Objekte集合 - 加入查询完成计数:确保所有异步请求完成后再更新UI,避免数据不全
- 增加空安全处理:使用
let替代!!,避免空指针异常 - 添加失败监听:处理各环节的查询失败情况,提升代码健壮性
内容的提问来源于stack exchange,提问作者Captai-N
相关产品推荐
相关产品推荐

