【问题标题】:CoreData - How to create duplicate object with existing object in swiftCoreData - 如何在 swift 中使用现有对象创建重复对象
【发布时间】:2017-11-20 14:26:24
【问题描述】:

这是克隆现有对象的代码,但它在 sourceSet.enumerated() 中的 (_,relatedObject) 行中崩溃了

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
    }
}

【问题讨论】:

  • 究竟是什么错误?您能否复制并粘贴控制台中打印的内容。

标签: ios swift core-data magicalrecord


【解决方案1】:

除了一些小错误之外,您还有一个大错误:您忘记将克隆对象的 to many 关系设置为新创建的 clonedSet。 另外,我建议使用更简洁的解决方案来创建 clonedSet:

let clonedSet = Set(sourceSet.map {($0 as! NSManagedObject).shallowCopy()!}) 
cloned.setValue(clonedSet, forKey: relKey)

小错误: 你打电话给mutableOrderedSetValue(forKey:)value(forKey:) 是凭空而来的。在适当的对象上调用它们。

例如,source.mutableOrderedSetValue(forKey: relKey) 而不是 mutableOrderedSetValue(forKey: relKey)

或者,在 shallowCopy 函数内部,self.value(forKey: attrKey) 而不是 value(forKey: attrKey)

【讨论】:

  • 感谢 SimSim 我会尝试检查
猜你喜欢
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 2020-03-19
  • 1970-01-01
  • 2014-04-28
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
相关资源
最近更新 更多