CoreData - 如何创建具有迅速
问题描述:
这个现有的对象重复的对象是克隆现有对象的代码,但它在行sourceSet.enumerated()
CoreData - 如何创建具有迅速
func clone(source:NSManagedObject,context:NSManagedObjectContext) -> NSManagedObject{
let entityName = source.entity.name
let cloned = NSEntityDescription.insertNewObject(forEntityName: entityName!, into: context) as! IZExperiment
//loop through all attributes and assign then to the clone
let attributes = NSEntityDescription.entity(forEntityName: entityName!, in: context)?.attributesByName
for (attrKey, _) in attributes! {
cloned.setValue(source.value(forKey: attrKey), forKey: attrKey)
}
//Loop through all relationships, and clone them.
let relationships = NSEntityDescription.entity(forEntityName: entityName!, in: context)?.relationshipsByName
for (relKey, relValue) in relationships! {
if relValue.isToMany {
let sourceSet = mutableOrderedSetValue(forKey: relKey)
let clonedSet = (copy() as AnyObject).mutableOrderedSetValue(forKey: relKey)
// let enumerator = sourceSet.enumerated()
for (_,relatedObject) in sourceSet.enumerated()
{
let clonedRelatedObject = (relatedObject as! NSManagedObject).shallowCopy()
clonedSet.add(clonedRelatedObject!)
}
} else {
cloned.setValue(value(forKey: relKey), forKey: relKey)
}
}
return cloned
}
extension NSManagedObject {
func shallowCopy() -> NSManagedObject? {
guard let context = managedObjectContext, let entityName = entity.name else { return nil }
let copy = NSEntityDescription.insertNewObject(forEntityName: entityName, into: context)
let attributes = entity.attributesByName
for (attrKey, _) in attributes {
copy.setValue(value(forKey: attrKey), forKey: attrKey)
}
return copy
}
}
答
其他坠毁的(_,则relatedObject),比一些小错误,你有一个很大的问题:你忘记将克隆对象的关系设置为新创建的克隆集。 另外,我建议创建一个clonedSet清洁的解决方案:
let clonedSet = Set(sourceSet.map {($0 as! NSManagedObject).shallowCopy()!})
cloned.setValue(clonedSet, forKey: relKey)
的小错误: 您是在稀薄的空气中调用mutableOrderedSetValue(forKey:)
和value(forKey:)
。在适当的对象上调用它们。
例如,mutableOrderedSetValue(forKey: relKey)
source.mutableOrderedSetValue(forKey: relKey)
代替或者,shallowCopy FUNC里面的self.value(forKey: attrKey)
代替value(forKey: attrKey)
+0
感谢SimSim我会尽力检查 –
到底是什么错误?你能复制并粘贴在控制台上打印的内容吗? –