【问题标题】:Mapping over a single CoreData property映射单个 CoreData 属性
【发布时间】:2021-03-22 15:32:24
【问题描述】:

我的问题是,无论每个已保存的 Core Data 实体实例的任何关系如何,如何得出单个属性的总和?

这个 CoreData 问题与我看到的其他问题不同,因为其他人谈到从 CoreData GUI 中定义的关系派生属性。这里没有关系。我只想获取单个 CoreData 实体上每个已保存实例的总数*。

希望视频对您有所帮助。

大图

目标:为实体的每个实例映射所有单个 CoreData 属性。

我最近对此进行了大量研究,目前正在等待 Apple 技术团队的回复。先说我看过WWDC Vid on Core Data,很有帮助。

但他们谈到如何从多个关系中派生属性。这是我想映射的单一关系。

以及我检查过的有关该主题的所有其他资源,(a good deal can be found here)。感谢@lorem ipsum 提供的资源。

但这些资源再次谈到了如何聚合来自不同关系的属性。

所以为了清楚起见,对于每个保存的 Core Data 实体实例,如何为单个属性不考虑任何关系导出总 sum。 p>

如果有人能建议我如何获取所有已保存实例的数组或字典,我会很高兴。

添加更多细节

这是我正在使用的类(简化)

   import Foundation
   import CoreData

@objc(Ticket)
public class Ticket: NSManagedObject { }


extension Ticket {
    @NSManaged var company: String
    @NSManaged var hoursWorked: Int64
 }

这是一个模拟 func 尝试传达我正在尝试做的事情的想法:

这是一个完全虚假的func,只是希望能澄清我正在尝试做的事情。

  func getAllHoursForCompany(_ company: String, using context: NSManagedObjectContext) -> Int {
  var allHours = [Int]()
  let workingCompany: Ticket(context: context) where Ticket.company == company

   for hours in workingCompany {
  allHours.append(hours)

}
  return allHours.reduce(0) { $0 + $1 }
}

【问题讨论】:

  • 这能回答你的问题吗? Core Data sum of all instances attribute。当然,您还需要使用谓词来仅计算公司的总和
  • @JoakimDanielson 我添加了这个类和一个模拟函数,希望能澄清我的想法。是的,我接受的答案适用于计算另一个关系中的属性。但是看看这张图片:atenivel.sirv.com/… 这个答案适用于此,看看它是如何从一个完整的关系中计算一个属性的属性,这个 CoreData 模型没有任何关系..希望澄清..
  • @JoakimDanielson 看起来像它......哇,这从来没有出现在我的搜索中......让我试一试......
  • @JoakimDanielson 效果很好,除了这会给我每个条目的所有时间,我试图弄清楚如何获得“Verizon”或“T-Mobile”等的所有时间。
  • 是的,我知道,这就是为什么我说你需要一个谓词

标签: swift core-data


【解决方案1】:

所以我找到了问题的答案,希望它可以帮助其他人:

 

let sumExpression = NSExpression(format: "sum:(hoursWorked)")
        let sumExpressionDesc = NSExpressionDescription()
        sumExpressionDesc.name = "sum"
        sumExpressionDesc.expression = sumExpression
        sumExpressionDesc.expressionResultType = .integer64AttributeType

        let fetchRequest: NSFetchRequest<Book> = Book.fetchRequest()
        fetchRequest.resultType = .dictionaryResultType
        fetchRequest.propertiesToFetch = ["company", sumExpressionDesc]
        fetchRequest.propertiesToGroupBy = ["company"]

        let result = try? persistentContainer.viewContext.execute(fetchRequest)

        if let fetchResult = result as? NSAsynchronousFetchResult<NSDictionary>,
           let nsDictionary = fetchResult.finalResult  {
            print(nsDictionary)
        }

这是针对manualCodeGen,它作为函数进入扩展

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 2014-02-27
    相关资源
    最近更新 更多