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

iOS卡路里追踪App按selectedDate查询Day实体结果为空问题求助

问题根因

Core Data 中的Date类型会存储包含时分秒的完整时间戳,你当前使用的date == %@谓词要求两个时间戳的年月日、时分秒完全一致才会命中匹配结果。绝大多数情况下,你存储的Day实体date属性和selectedDate的时分秒部分存在差异,因此查询不到匹配数据。

修复方案

推荐使用日期范围查询实现按天匹配,构造查询当天0点到次日0点的时间区间,匹配所有落在这个区间内的date属性即可,代码修改如下:

class secondViewController {
    var result: [Day] = []
    var selectedDate: Date! // 确保selectedDate已经被datePicker正确赋值

    func loadItems() {
        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        let request: NSFetchRequest<Day> = Day.fetchRequest()
        
        // 构造当天0点和次日0点的时间边界
        let calendar = Calendar.current
        let startOfDay = calendar.startOfDay(for: selectedDate)
        let endOfDay = calendar.date(byAdding: .day, value: 1, to: startOfDay)!
        
        // 修改谓词为匹配落在时间区间内的date
        request.predicate = NSPredicate(format: "date >= %@ AND date < %@", startOfDay as CVarArg, endOfDay as CVarArg)

        do {
            result = try context.fetch(request)
            // 拿到结果后更新UILabel
            if let targetDay = result.first {
                yourLabel.text = String(format: "%.1f", targetDay.calories)
            } else {
                yourLabel.text = "0" // 当天无记录时显示0
            }
        } catch {
            print("Error fetching data \(error)") // 原代码这里错误提示写的是saving,属于笔误
        }
    }

    func printDay () {
        print("\(result.count)")
    }
}
额外排查点

如果修改后还是查询不到结果,按以下顺序排查:

  • 确认loadItems()调用时机在selectedDate被datePicker赋值之后,不要在selectedDate还没赋值就提前调用查询
  • 先移除谓词查询所有Day实体,打印所有实体的date属性,确认Core Data中确实存在对应日期的存储记录
  • 存储Day实体时也建议统一用calendar.startOfDay(for: 日期)处理后再存入,避免后续查询出现时间匹配问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:36:04