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

CoreData问题:健身App中TableView无法加载已存储行程数据

嘿,我一眼就发现问题所在啦——你还没从CoreData里把已保存的Journey数据加载到journeyArray里呢!所以控制台打印计数为0完全合理,因为数组一开始就是空的,没人给它塞数据呀😉

下面给你一步步解决这个问题:

核心问题分析

你的代码只声明了存储数据的数组,但没有执行从CoreData中查询数据的逻辑,也没有通知TableView刷新显示。我们需要补上这部分关键代码。

修改后的完整代码

import UIKit
import CoreData

class SavedJourneysViewController: UITableViewController {
    var journeyArray: [Journey] = []
    // 获取CoreData的上下文(和数据库交互的核心对象)
    private let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 视图加载时立刻获取数据
        fetchJourneys()
    }
    
    // 单独封装获取CoreData数据的方法
    private func fetchJourneys() {
        // 创建针对Journey实体的查询请求
        let request: NSFetchRequest<Journey> = Journey.fetchRequest()
        
        // 可选:给查询结果按日期排序(最新的行程排在最前面)
        let sortDescriptor = NSSortDescriptor(key: "date", ascending: false)
        request.sortDescriptors = [sortDescriptor]
        
        do {
            // 执行查询,把结果赋值给数组
            journeyArray = try context.fetch(request)
            // 通知TableView刷新,这样数据才会显示出来
            tableView.reloadData()
        } catch {
            // 捕获查询错误,方便排查问题
            print("获取行程数据失败: \(error.localizedDescription)")
        }
    }
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        print(journeyArray.count)
        return journeyArray.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "JourneyItem", for: indexPath)
        // 给Cell设置行程数据(别漏了这一步,不然Cell还是空的)
        let journey = journeyArray[indexPath.row]
        
        // 处理布尔型的distance,转成用户能看懂的文字
        let distanceText = journey.distance ? "已记录距离" : "未记录距离"
        // 处理时间戳date,转成可读的日期格式
        let dateFormatter = DateFormatter()
        dateFormatter.dateStyle = .medium
        dateFormatter.timeStyle = .short
        let dateText = dateFormatter.string(from: journey.date ?? Date())
        
        cell.textLabel?.text = dateText
        cell.detailTextLabel?.text = distanceText
        return cell
    }
}

额外排查提示

如果修改后还是没有数据,可以检查这几点:

  • 确认CoreData实体Journey的属性名和代码完全一致:distance(布尔型)、date(Date类型)
  • 确保你之前保存行程时,确实把数据存入了CoreData(而不是只存在临时变量里)
  • 如果项目用了多个CoreData上下文,要保证查询用的viewContext和保存数据的上下文是同一个

内容的提问来源于stack exchange,提问作者henocookie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:28:38