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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 01:20:44