我想从我的核心数据数据库中复制一个对象。现在我正在使用
movement2 = [NSEntityDescription
insertNewObjectForEntityForName:@"Movement"
inManagedObjectContext:self.managedObjectContext];
movement2.name = movement.name;
movement2.value = movement.value;
movement2.date = movement.date;
... 而且它是有效的。但是..。
有没有办法在一行代码中将movement的所有值复制到movement2?
发布于 2012-02-19 06:15:42
与NSObject不同,NSManagedObject提供了一个应用程序接口来迭代其属性和关系。或者,更确切地说,它的实体描述是。不过,这不是一行代码。
movement2 = [NSEntityDescription insertNewObjectForEntityForName:@"Movement"
inManagedObjectContext:self.managedObjectContext];
NSEntityDescription *entity = [movement entity];
for (NSString *propertyName in [entity propertiesByName]) {
[movement2 setValue:[movement valueForKey:propertyName] forKey:propertyName];
}有关更多详细信息,请参阅the documentation。
这将足以克隆大多数对象。如果数据库结构是正确的,那么以这种方式复制关系,它们的反向关系也会更新。因此,如果您的移动与MovementDirection有关系,并且MovementDirection具有反向一对多关系parentMovements,则在调用上面的代码后,此parentMovements集将同时包含movement和movement2。
发布于 2012-02-19 02:55:28
API中没有复制NSManagedObjects的方法,因为它们既不符合NSCopying,也不符合NSCoding。考虑到如果对象具有关系,您通常不清楚如何复制该对象,这是有意义的:它应该与相同的对象有关系,还是它们的副本?那些复印件呢?这些都是困难的问题,其答案可能取决于关系的性质(对多或对一),因此取决于核心数据的特定用例。
所以简短的回答是:我会做你在代码片段中做的事情,或者可能写一个方法来复制。看起来你的NSManagedObject只有简单的属性,没有关系,所以它应该很简单。
发布于 2018-03-26 21:05:58
我已经为NSManagedObject做了一个简单的副本扩展(基于@coverback的答案)。小心使用(尽管到目前为止对我来说是有效的)
Swift 4:
enum CopyBehavior {
case none, copy, deepcopy
}
extension NSManagedObject {
func duplicate(only: [String]) -> NSManagedObject {
return duplicate { only.contains($0) ? .copy : .none }
}
func duplicate(except: [String], deep: [String] = []) -> NSManagedObject {
return duplicate { deep.contains($0) ? .deepcopy : except.contains($0) ? .none : .copy }
}
func duplicate(byProperties fun: (String) -> CopyBehavior) -> NSManagedObject {
let duplicate = NSEntityDescription.insertNewObject(forEntityName: entity.name!, into: managedObjectContext!)
for propertyName in entity.propertiesByName.keys {
switch fun(propertyName) {
case .copy:
let value = self.value(forKey: propertyName)
duplicate.setValue(value, forKey: propertyName)
case .deepcopy:
let value = self.value(forKey: propertyName)
if let value = value as? NSSet {
let copy = value.map {
return ($0 as! NSManagedObject).duplicate(byProperties: fun)
}
duplicate.setValue(copy, forKey: propertyName)
}
else if let value = value as? NSOrderedSet {
let copy = value.map {
return ($0 as! NSManagedObject).duplicate(byProperties: fun)
}
duplicate.setValue(NSOrderedSet(array: copy), forKey: propertyName)
}
else if let value = value as? NSManagedObject {
let copy = value.duplicate(byProperties: fun)
duplicate.setValue(copy, forKey: propertyName)
}
else {
fatalError("Unrecognized deepcopy attribute!")
}
case .none:
break
}
}
return duplicate
}
}https://stackoverflow.com/questions/9344064
复制相似问题