在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】:你可以在一行中做到这一点。如果从Person
到Statement
的关系称为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 对象添加属性