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

如何读取嵌套集合中的所有对象?文档采用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:15:40