Swift 4 CoreData NSFetchRequest:计算变量

时间:2018-03-04 20:11:49

标签: ios swift xcode core-data nsexpression

我正在使用CoreData进行持久化,并希望将NSFetchRequest与NSExpression一起使用(forFunction:“sum:”...)。

我有三个实体

Entity A:
    name: String
    value: Int64
Entity B:
    name: String
Entity C:
    relationship1: A
    relationship2: B
    value: Int64

我有一个单独的实体用于A-和B-实体之间的关系,因为关系也具有Int64值。

我想这是最简单的解决方案,不总结给定C组的一个属性(使用NSPredicate进行过滤),而是总结C.value和C.relationship1的乘积。值。由于乘法,我找不到将和的项(C.value * C.relationship1.value)作为NSExpressions传递的解决方案。但我认为使用计算变量会更容易。 (虽然这感觉效率有点低)但是对于计算变量“forKey:”不起作用,“forVariable:”也没有。无论如何,我可能以错误的方式使用它。无论如何,当代码执行时,应用程序崩溃。

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unsupported argument to sum : (
"$C.product")'


import Foundation
import CoreData

@objc(C)
public class C: NSManagedObject {

@objc var product : Int64 {
    if let test = self.relationship1.value {
        return test * self.value
    } else {
        return 0
    }
  }
}

NSFetchRequest如下所示:

let fetchRequest = NSFetchRequest<NSDictionary>(entityName: "C")
fetchRequest.resultType = .dictionaryResultType

let sumExpressionDesc = NSExpressionDescription()
sumExpressionDesc.name = "returnValue"

let predicate = NSPredicate(format: "C.relationship1.name == %@", name)

let expression = NSExpression(forkeyPath: #keyPath(C.product)) //This is the line that crashes the App
sumExpressionDesc.expression = NSExpression(forFunction: "sum:", arguments: [expression])
sumExpressionDesc.expressionResultType = .integer32AttributeType

fetchRequest.predicate = predicate
fetchRequest.propertiesToFetch = [sumExpressionDesc]

do {
    let results = try managedObjectContext.fetch(fetchRequest)
    (...)

访问计算值产品在其他地方没有问题。它不能与NSFetchRequest结合使用。

提前致谢

0 个答案:

没有答案