Как мне отобразить данные CoreData за прошлую неделю или месяц?

#swift #date #core-data #swiftui #nspredicate

#swift #Дата #core-data #swiftui #nspredicate

Вопрос:

У меня есть данные, сохраненные в виде блюд; Завтрак, обед, ужин и закуски. Я пытаюсь вернуть общее количество калорий от всех приемов пищи за каждый день за предыдущую неделю.

Данные о приеме пищи сохраняются, как показано ниже, с помощью .Дата :

 func saveBreakfast() {
             
         
    let newBreakfastItem = BreakfastItem(context: self.moc)
    newBreakfastItem.id = UUID()
    newBreakfastItem.name = self.item.name
    newBreakfastItem.calories = Int32(self.totalCalories)
    newBreakfastItem.carbs = Int32(self.totalCarbs)
    newBreakfastItem.protein = Int32(self.totalProtein)
    newBreakfastItem.fat = Int32(self.totalFats)
    newBreakfastItem.date = self.dateAdded




    do {
        if self.mocB.hasChanges { // saves only if changes are made
            try? self.mocB.save()
     
        }
     
    }
 }



func saveLunch() {
  

    let newLunchItem = LunchItem(context: self.moc)
    newLunchItem.id = UUID()
    newLunchItem.name = self.item.name
    newLunchItem.calories = Int32(self.caloriesPerServing)
    newLunchItem.carbs = Int32(self.carbsPerServing)
    newLunchItem.protein = Int32(self.proteinPerServing)
    newLunchItem.fat = Int32(self.fatsPerServing)
    newLunchItem.date = self.dateAdded

    do {
        if self.mocL.hasChanges {
            try? self.mocL.save()
        }
    }
}
  

В настоящее время я работаю с приведенной ниже функцией, чтобы попытаться заставить ее работать в течение одного дня (Date() — 1 день, то есть вчера)

 func dayOneCal(at date: Date) -> NSNumber {

    
    let request1:NSFetchRequest<BreakfastItem> = BreakfastItem.fetchRequest() as! NSFetchRequest<BreakfastItem>
    let request2:NSFetchRequest<LunchItem> = LunchItem.fetchRequest() as! NSFetchRequest<LunchItem>
    let request3:NSFetchRequest<DinnerItem> = DinnerItem.fetchRequest() as! NSFetchRequest<DinnerItem>
    let request4:NSFetchRequest<SnackItem> = SnackItem.fetchRequest() as! NSFetchRequest<SnackItem>


    let startDate = Calendar.current.startOfDay(for: date)
    var components = DateComponents()
    components.day = -1
    components.second = -1
    let endDate = Calendar.current.date(byAdding: components, to: startDate)!

    request1.predicate = NSPredicate(format: "date >= %@ AND date <= %@", startDate as NSDate, endDate as NSDate)

    request2.predicate = NSPredicate(format: "date >= %@ AND date <= %@", startDate as NSDate, endDate as NSDate)

    request3.predicate = NSPredicate(format: "date >= %@ AND date <= %@", startDate as NSDate, endDate as NSDate)

    request4.predicate = NSPredicate(format: "date >= %@ AND date <= %@", startDate as NSDate, endDate as NSDate)



    let totalDailyBreakfastCals = BreakfastItems.map({$0.calories}).reduce(0,  )
    let totalDailyLunchCals = LunchItems.map({$0.calories}).reduce(0,  )
    let totalDailyDinnerCals = DinnerItems.map({$0.calories}).reduce(0,  )
    let totalDailySnacksCals = SnackItems.map({$0.calories}).reduce(0,  )

    let totalDailyCals = totalDailyBreakfastCals   totalDailyLunchCals    totalDailyDinnerCals   totalDailySnacksCals


    return totalDailyCals as NSNumber



}
  

Любая помощь была бы с благодарностью принята, заранее благодарю!

Комментарии:

1. Что работает, что не работает? Неясно, где именно вы боретесь.

2. Возможно, вам не следует добавлять -1 к начальной дате при вычислении конечной даты, если вы не хотите, чтобы конечная дата была после начальной даты, то есть 😉

3. Вы показали код для сохранения ваших объектов, и вы определили свои NSFetchRequest ы. Вы действительно выполняете эти запросы против NSManagedObjectContext ?