Kotlin中Firestore数据计算成本及循环迭代错误求助
问题解决与实现思路
一、Firestore循环错误修复
你当前代码的问题在于:调用document("little bistro").get()获取的是单个文档快照(DocumentSnapshot),不是查询多个文档返回的QuerySnapshot,所以它没有documents集合,自然不能用for循环遍历。
要获取单个餐厅的价格,直接读取字段即可,不需要循环:
// 修正后的单个文档读取逻辑 db.collection("city") .document("places").collection("restaurant") .document("little bistro") .get() .addOnSuccessListener { documentSnapshot -> // 直接读取price字段,注意判空处理 val restaurantPrice = documentSnapshot.getLong("price")?.toInt() ?: 0 calc = restaurantPrice + 100 txtresult.setText(calc.toString()) } .addOnFailureListener{ txtresult.setText("fail") }
如果需要获取多个餐厅的数据,要调用collection("restaurant").get()(不要指定document),此时返回的是QuerySnapshot,才能遍历result.documents。
二、总成本计算与方案筛选实现思路
1. 数据准备
- 先把所有需要的Firestore数据同步到本地:
- 所有餐厅的成本数据(如果有多个可选餐厅)
- 所有起点-目的地的交通数据:整理成结构化数据(比如用Kotlin数据类
TransportOption,包含起点、目的地、交通方式、成本)
- 定义一个数据类存储方案信息,方便后续存入ArrayList:
data class TravelPlan( val startPoint: String, val destination: String, val transportType: String, val restaurantName: String, val totalCost: Int )
2. 遍历所有组合并筛选
- 用嵌套循环覆盖所有可能性:
- 外层循环遍历所有餐厅
- 中层循环遍历所有起点
- 内层循环遍历每个起点的3种交通方式
- 再遍历所有目的地(如果交通成本是起点到目的地的对应值)
- 每遍历一个组合,计算总成本:
总成本 = 人数 × 天数 × (餐厅成本 + 交通成本) - 判断总成本是否低于输入预算,符合条件就创建
TravelPlan对象,加入ArrayList
3. 异步数据处理注意点
Firestore数据获取是异步的,必须等所有需要的数据(餐厅、交通)都加载完成后,再执行组合计算。可以用Firebase的Tasks.whenAll()来等待多个异步请求完成,避免出现数据未就绪就开始计算的问题。
三、学习方向建议
- 先补Kotlin基础:重点掌握数据类、集合(ArrayList/List/Map)操作、嵌套循环逻辑
- 吃透Firestore核心概念:区分单个文档(DocumentSnapshot)和集合查询(QuerySnapshot)的用法,理解异步回调的执行顺序
- 练习拆解复杂逻辑:把“多维度组合计算”拆成“获取数据→定义数据结构→遍历组合→筛选结果”的小步骤,逐步实现
内容的提问来源于stack exchange,提问作者gagitrr
相关产品推荐
相关产品推荐

