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
相关产品推荐
相关产品推荐

