2016-11-27 2 views
0

В моем приложении у меня есть некоторые транзакции, добавленные по дате. Каждая транзакция будет иметь поле amount, и я хочу рассчитать сумму всех транзакций для данного диапазона, скажем, текущей недели.Как рассчитать сумму за каждый день недели в базовых данных

Как это можно сделать с помощью Core Data?

Я подумал о двух способов:

  1. перебрать диапазоне Date и вычислить сумму для каждой итерации
  2. Использование propertiesToGroupBy и propertiesToFetch от NSFetchRequest

ли один из этого подходит хорошо? Или есть ли другой способ сделать это?

+0

Установка 'propertiesToGroupBy' вместе с использованием' sum' aggregate выполняет работу в БД, в то время как ваше приложение просто собирает результаты. Полученный код также должен быть легче читать. – dasblinkenlight

+0

У вас есть пример, как это сделать? Я попытался использовать propertiesToGroupBy, но мне нужно установить тип результата в словарь и его не работать для меня. – Kobe

+0

[Здесь Q & A, который показывает, как вычислять сумму с помощью 'propertiesToGroupBy'] (http://stackoverflow.com/a/28014825/335858). – dasblinkenlight

ответ

0

мне удалось сделать это следующим образом:

let amountExpr = NSExpression(forKeyPath: "amount") 
let sumExpr = NSExpression(forFunction: "sum:", arguments: [amountExpr]) 
let sumDescr = NSExpressionDescription() 
sumDescr.expression = sumExpr 
sumDescr.name = "sumOfAmount" 
sumDescr.expressionResultType = .doubleAttributeType 

let dateExpr = NSExpression(forKeyPath: "date") 
let dateDescr = NSExpressionDescription() 
dateDescr.expression = dateExpr 
dateDescr.name = "date" 
dateDescr.expressionResultType = .dateAttributeType 

let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Transaction") 
    request.sortDescriptors = Transaction.defaultSortDescriptors 
    request.propertiesToFetch = [dateDescr, sumDescr] 
    request.propertiesToGroupBy = [dateDescr] 
    request.resultType = .dictionaryResultType 
    request.returnsObjectsAsFaults = false 
    request.predicate = Transaction.rangeOfDatesPredicate(dateRange: Date.week()) 
let results = try! context.fetch(request) as! [NSDictionary] 

for value in results { 
    print(value) 
} 

Теперь value будет словарем с датой в качестве ключа и суммы в качестве значения.

Примечание: чтобы сделать эту работу, я должен настроить время, чтобы быть одинаковым для каждой даты, которая добавляется к Core Data, в противном случае каждая дата будет отличаться.

extension Date { 
    static func current() -> Date { 
     let calendar = Calendar.current 

     var components = calendar.dateComponents([.year, .month, .day], from: Date()) 
     components.hour = 00 
     components.minute = 00 
     components.second = 00 

     return calendar.date(from: components)! 
    } 
} 
Смежные вопросы