Core data 对CoreData使用总和聚合

Core data 对CoreData使用总和聚合,core-data,sum,swift2,Core Data,Sum,Swift2,我尝试在属性上使用Sum aggregate函数,但遇到一个无法纠正的奇怪错误: 2015-12-13 11:32:29.280 YoBuM[634:42509]-[NSDecimalNumber count]:发送到实例0x618000025ce0的无法识别的选择器 2015-12-13 11:32:29.281 YoBuM[634:42509]-[NSDecimalNumber count]:发送到实例0x618000025ce0的无法识别的选择器 2015-12-13 11:32:29.2

我尝试在属性上使用Sum aggregate函数,但遇到一个无法纠正的奇怪错误:

2015-12-13 11:32:29.280 YoBuM[634:42509]-[NSDecimalNumber count]:发送到实例0x618000025ce0的无法识别的选择器
2015-12-13 11:32:29.281 YoBuM[634:42509]-[NSDecimalNumber count]:发送到实例0x618000025ce0的无法识别的选择器
2015-12-13 11:32:29.286约本[634:42509](
0核心基金会
0x00007fff8a8e0ae2例外预处理+178
1 libobjc.A.dylib
0x00007fff97b6473c objc_异常_抛出+48
2核心基金会
0x00007fff8a8e3b9d-[NSObject(NSObject)不可识别选择器:+205
3核心基金会
0x00007fff8a81c601\uuuuuuuuuuuuuuuuuu+1009
4核心基金会
0x00007fff8a81c188 _CF_转发_准备_0+120
5基金会
0x00007fff9796cff6+[\u NSPredicateUtilities\u getCommonTypeFor:][76
6基金会
0x00007fff9796d30a+[\u NSPredicateUtilities总和:][144
7基金会
0x00007fff977d2cff-[NSFunctionExpression expressionValueWithObject:context:+1094…

我的代码是:

import Foundation
import CoreData

@objc(Operation)
class Operation: NSManagedObject {
    @NSManaged var amount: NSNumber?
    @NSManaged var date: NSDate?
    @NSManaged var days: NSNumber?
    @NSManaged var designation: String?
    @NSManaged var isDebit: NSNumber?
    @NSManaged var element: Element?

    class func tests(appDel: AppDelegate, forElement: Element) -> (q1: Double, q2: Double, q3: Double, q4: Double) {
        let moc = appDel.managedObjectContext
        let request = NSFetchRequest(entityName: "Operation")

        let expressionDesc = NSExpressionDescription()
        expressionDesc.name = "sumOfAmount"
        let amountExpr = NSExpression(forKeyPath: "amount")
        expressionDesc.expression = NSExpression(forFunction: "sum:", arguments: [amountExpr])
        expressionDesc.expressionResultType = .DoubleAttributeType
        request.propertiesToFetch = [expressionDesc]
        request.resultType = .DictionaryResultType

        let elementPredicate = NSPredicate(format: "element = %@", forElement)
        let creditPredicate = NSPredicate(format: "isDebit = %@", true)

        let year = (forElement.budget as! Budget).year!.integerValue
        var minDate = Utils.getDate("01/01/\(year)")
        var maxDate = Utils.getDate("04/01/\(year)")
        let datesPredicate = NSPredicate(format: "(date >= %@) AND (date < %@)", minDate, maxDate)
        let predicates = NSCompoundPredicate(andPredicateWithSubpredicates: [elementPredicate, creditPredicate, datesPredicate])
        request.predicate = predicates

        do {
            //error is here when some entities are found for the given predicates
            let results = try moc.executeFetchRequest(request)

            // ...
        }
        catch {
            fatalError("Oops: \(error).")
        }
        //return (q1, q2, q3, q4)
    }
}
<代码>导入基础 导入CoreData @objc(操作) 类操作:NSManagedObject{ @NSVAR管理金额:NSNumber? @NSVAR管理日期:NSDate? @NSVAR管理天数:NSNumber? @NSVAR名称:字符串? @NSVAR管理isDebit:NSNumber? @NSVAR托管元素:元素? 类func测试(appDel:AppDelegate,forElement:Element)->(q1:Double,q2:Double,q3:Double,q4:Double){ 让moc=appDel.managedObjectContext let request=NSFetchRequest(entityName:“操作”) 让expressionDesc=NSExpressionDescription() expressionDesc.name=“sumOfAmount” 让amountExpr=NSExpression(forKeyPath:“amount”) expressionDesc.expression=NSExpression(for函数:“sum:”,参数:[amountExpr]) expressionDesc.expressionResultType=.DoubleAttributeType request.propertiesToFetch=[expressionDesc] request.resultType=.DictionaryResultType let elementPredicate=NSPredicate(格式:“element=%@”,forElement) 让creditPredicate=NSPredicate(格式:“isDebit=%@”,true) 让year=(forElement.budget为!budget).year!。integerValue var minDate=Utils.getDate(“01/01/\(年)”) var maxDate=Utils.getDate(“04/01/\(年)”) 让datesPredicate=NSPredicate(格式:“(日期>=%@)和(日期<%@)”,minDate,maxDate) let predicates=NSCompoundPredicate(和PredicateWithSubpredicates:[elementPredicate,creditPredicate,datesPredicate]) request.predicate=谓词 做{ //当为给定谓词找到某些实体时,此处出现错误 让结果=尝试moc.executeFetchRequest(请求) // ... } 抓住{ fatalError(“Oops:\(错误)。”) } //回报(第一季度、第二季度、第三季度、第四季度) } } 我不知道为什么在错误跟踪中有计数选择器。 我在这里选择了“好”的总结方法吗


谢谢。

首先,这应该是一个类方法。您正在获取任意的
操作
实例,因此没有很好的理由说明为什么应该在一个特定实例的上下文中调用它

其次,我认为这可以大大简化如下:获取具有给定约束的所有操作,然后:

let q1Sum = (operations as NSArray).valueForKeyPath("@sum.amount").doubleValue
或者,更“迅速地”:


进入
NSExpression
复杂性和使用
NSDictionaryResultType
没有明显的理由,除非您遇到性能问题,这是不太可能的。

首先,这应该是一个类方法。您获取的是任意
操作
实例,因此没有好的参数解释了为什么应该在一个特定实例的上下文中调用它

其次,我认为这可以大大简化如下:获取具有给定约束的所有操作,然后:

let q1Sum = (operations as NSArray).valueForKeyPath("@sum.amount").doubleValue
或者,更“迅速地”:


进入
NSExpression
复杂性和使用
NSDictionaryResultType
,没有明显的理由,除非您遇到性能问题,这是不太可能的。

好的,谢谢您的关注。但是我不明白
操作的起源。如果我评论所有关于N的行SExpression,
results
将包含一个我不知道如何聚合的
操作数组。我应该错过一些明显的东西…您可以使用适当的谓词过滤器获取
操作
。总和的计算结果显示在我的答案中。很抱歉,我对这个主题的了解不多,我从Swif开始所以我不太明白;)我删除了所有关于
NSExpressions
的内容,并更改了获取请求,如下所示:
让q1Sum=results.valuesForKeyPath()/>类型“[Operation]”的值没有成员“valuesForKeyPath”
。换句话说,我如何得到这个
操作
变量/成员,允许我调用valuesForKeyPath(string)?它是
valueForKeyPath
而不是
valuesForKeyPath
。您可能需要转换到NSArray:
(结果为NSArray)。valueForKeyPath(@sum.amount”)
。我编辑了我的答案,也给出了更快捷的语法。好的,谢谢你的关注。但是我不明白
操作的起源。如果我注释所有与NSExpression相关的行,
results
将包含一个
操作数组,我不知道如何聚合该数组。我应该错过一些明显的东西……您可以使用适当的谓词过滤器获取
操作。我的答案中显示了总和的计算。对不起,我在这方面的知识很差,我是从Swift开始的,所以我不太懂;)我删除了所有关于
NSExpressions
的内容,并更改了获取请求,如下所示:
让q1Sum=results.valuesForKeyPath()/>类型的值