мне удалось сделать это следующим образом:
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)!
}
}
Установка 'propertiesToGroupBy' вместе с использованием' sum' aggregate выполняет работу в БД, в то время как ваше приложение просто собирает результаты. Полученный код также должен быть легче читать. – dasblinkenlight
У вас есть пример, как это сделать? Я попытался использовать propertiesToGroupBy, но мне нужно установить тип результата в словарь и его не работать для меня. – Kobe
[Здесь Q & A, который показывает, как вычислять сумму с помощью 'propertiesToGroupBy'] (http://stackoverflow.com/a/28014825/335858). – dasblinkenlight