CoreData:按 NSManagedObject 分组获取

问题描述 投票:0回答:1

我正在使用 NSBatchInsert 插入数十万个对象,现在我想添加对象之间的关系(假设 A 和 B,具有一对多关系),因为没有批处理操作支持关系,我需要使用最有效的关系实现我想要的快速方法,我能想到的最好方法是使用“GroupBy”来获取对象,但这将导致启动一个循环来获取 A 实体(因为字典的键将是一个属性不是一个对象)。

有没有办法让字典作为获取结果,其键为 NSManagedObject(A 对象),值为 NSManagedObject 数组(B 对象)?

-> 让结果:[A: [B]]

谢谢你

ios swift core-data batch-insert
1个回答
0
投票

要实现此目的,您不能直接按 NSManagedObject 本身进行分组,因为 CoreData 不允许在获取结果中按对象引用进行分组。但是,您可以执行提取来获取相关对象 (B),然后使用字典按相关 A 对象手动对它们进行分组。

这里有一个方法:

使用带有 NSPredicate 或 NSBatchInsertRequest 的 NSFetchRequest 来执行 B 对象及其相关 A 对象的获取,以提高效率。 获取后,迭代 B 对象并按 A 对象的唯一标识符对它们进行分组(用于比较)。 迅速 复制代码

 let fetchRequest: NSFetchRequest<B> = B.fetchRequest()
 fetchRequest.relationshipKeyPathsForPrefetching = ["a"] // Ensure A is 
  fetched
 do {
   let bObjects = try context.fetch(fetchRequest)
   var groupedResult: [A: [B]] = [:]

   for b in bObjects {
     if let a = b.a {
        groupedResult[a, default: []].append(b)
     }
 }
} catch {
print("Failed to fetch B objects: \(error)")
}
© www.soinside.com 2019 - 2024. All rights reserved.