我正在使用 NSBatchInsert 插入数十万个对象,现在我想添加对象之间的关系(假设 A 和 B,具有一对多关系),因为没有批处理操作支持关系,我需要使用最有效的关系实现我想要的快速方法,我能想到的最好方法是使用“GroupBy”来获取对象,但这将导致启动一个循环来获取 A 实体(因为字典的键将是一个属性不是一个对象)。
有没有办法让字典作为获取结果,其键为 NSManagedObject(A 对象),值为 NSManagedObject 数组(B 对象)?
-> 让结果:[A: [B]]
谢谢你
要实现此目的,您不能直接按 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)")
}