如何在核心数据中计算一周中每天的总和



在我的应用程序中,我按日期添加了一些交易。每笔交易都有一个amount字段,我想计算给定范围内所有交易的总和,比如本周。

如何使用核心数据做到这一点?

我想到了两种方法:

  1. 迭代Date范围并计算每次迭代的总和
  2. 使用propertiesToGroupBypropertiesToFetchfromNSFetchRequest

这种方法之一好吗?或者有没有其他方法可以做到这一点?

我设法这样做:

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)!
}
}

最新更新