在CoreData ios 10的实体内添加一个属性

Posted

技术标签:

【中文标题】在CoreData ios 10的实体内添加一个属性【英文标题】:Adding up an attribute inside entity for CoreData ios 10 【发布时间】:2016-12-21 17:19:55 【问题描述】:

我有一个 tableView,该 tableview 正在填充来自 Coredata 的数据。数据是这样分解的。

实体 - 人

实体 - 声明 语句实体有一个名为amountOwed的属性,它是十进制类型。

关系是一个人可以有许多陈述,但每个陈述属于一个人。

这是我要添加的数据的路径。人员 > 报表 > AmountOwed。

在 tableView 函数中,我有一个代表 Person 实体的 let。

let person = fetchedResultsController.object(at: indexPath)

我知道它的工作原理,因为我可以像这样打印出人名

print(person.name) // Bob

我想要做的是将 Statement 实体中每个 Person 的所有 amountOwed 属性相加,并将它们显示在一个单元格上。

我一直在尝试按照计算获取的示例进行操作,但我似乎不太了解如何定位与每个 Person 实体相关联的 Statements 实体。

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

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

            let specialCountExp = NSExpression(forKeyPath: #keyPath(Person.statement[indexPath].amountOwed))

            sumExpressionDesc.expression = NSExpression(forFunction: "sum:", arguments: [specialCountExp])

            sumExpressionDesc.expressionResultsType = .interger32AttributeType

            fetchRequest.propertiesToFetch = [sumExpressionDesc]

            do
                let results = try coreDataStack.managedContext.fetch(fetchRequest)

                let resultDict = results.first!
                let numDeals = resultDict["sumDeals"]
                print(numDeals!)
            

            catch let error as NSError
                print("Count not fetched \(error), \(error.userInfo)")
            

我需要获取 Statement 实体还是应该只使用 FetchedREsultsController?如果我确实使用了我的 fetchedResultsController,Statement Entity 的键路径是否看起来像这样

person[indexPath].statement.amountOwed

【问题讨论】:

【参考方案1】:

你可以在一行中做到这一点。如果从PersonStatement 的关系称为statements,您将获得与

let amountTotal = newPerson.value(forKeyPath: "statements.@sum.amount") as? Int64

将末尾的向下转换从Int64 更改为适合您的amount 属性的任何值-- Double 或其他值。

【讨论】:

哇,多么棒的解决方案,如此简单和干净。谢谢!【参考方案2】:

在您的People+CoreDataClass 上添加:

var totalOwed: Float 
    get 
        var value: Float = 0

        if let statements = self.statements.allObjects() as? [Statement] 
          for s in statements 
              value = value + s.sum
           
        
     return value    


并从您的 fetch 中删除所有不必要的代码

【讨论】:

以上是关于在CoreData ios 10的实体内添加一个属性的主要内容,如果未能解决你的问题,请参考以下文章

错误:将实体添加到 CoreData 时“在实体中找不到键路径索引”

iOS Core Data:使用 Foundation 对象添加属性

xcode/ios/coredata:添加新记录后,tableview 中的最后一条记录显示两次

CoreData 排序实体 - 性能

iOS 9 和 iOS 10 CoreData 同时

iOS CoreData版本升级和数据库迁移