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

Ios 如何计算核心数据中一周内每天的总和,ios,swift,core-data,Ios,Swift,Core Data,在我的应用程序中,我按日期添加了一些事务。每笔交易都会有一个金额字段,我想计算给定范围内(比如本周)所有交易的总和 如何利用核心数据做到这一点 我想到了两种方法: 迭代日期范围,并计算每次迭代的总和 使用propertiesToGroupBy和propertiesToFetchfromNSFetchRequest 其中一种方法好吗?或者还有其他方法可以做到这一点吗?我设法做到了这一点: let amountExpr = NSExpression(forKeyPath: "amount") let

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

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

我想到了两种方法:

  • 迭代
    日期范围
    ,并计算每次迭代的总和
  • 使用
    propertiesToGroupBy
    propertiesToFetch
    from
    NSFetchRequest

  • 其中一种方法好吗?或者还有其他方法可以做到这一点吗?

    我设法做到了这一点:

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

    我是这样做的:

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

    设置
    propertiesToGroupBy
    并使用
    sum
    aggregate可以在数据库中完成这项工作,而您的应用程序只需收集结果。生成的代码也应该更容易阅读。你有一个如何做到这一点的例子吗?我尝试使用propertiesToGroupBy,但我必须将结果类型设置为dictionary,这对我来说不起作用。我现在正在看同样的东西。对我来说,它不起作用,它说:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“传递给setPropertiesToFetch的密钥路径日期无效:'这是当我将NSExpressionDescription添加到propertiesToFetchSetting
    propertiesToGroupBy
    以及使用
    sum
    aggregate在数据库中工作时,而你的应用程序只是简单地收集结果。生成的代码也应该更容易阅读。你有一个如何做到这一点的例子吗?我尝试使用propertiesToGroupBy,但我必须将结果类型设置为dictionary,这对我来说不起作用。我现在正在看同样的东西。对我来说,它不起作用,它说:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“传递给setPropertiesToFetch的密钥路径日期无效:'这是我将NSExpressionDescription添加到propertiesToFetch的时候