不可能复制核心数据NSManagedObject?
我试图复制一个NSManagedObject,它包含一个核心数据实例,但是我这样做时会出现一些非常奇怪的行为,就像这些对象在复制之后以某种方式链接到对方,并且更改为另一个也会影响另一个。不可能复制核心数据NSManagedObject?
NSManagedObject *originalTransactionRow = [self.transactionRowsRows objectAtIndex:indexPath.row];
NSManagedObject *originalTransactionHeader = [self.transactionRowsHeader objectAtIndex:0];
NSString *originalOrderNumberLocalStr = [originalTransactionRow valueForKey:@"orderNumber"];
NSString *returnOrderNumber = [NWTillHelper getNewOrderNumber];
NSManagedObject *returnOrderHeader = nil;
NSManagedObject *returnOrderRow = nil;
returnOrderHeader = [NSEntityDescription insertNewObjectForEntityForName:@"OrderHead" inManagedObjectContext:context];
returnOrderRow = [NSEntityDescription insertNewObjectForEntityForName:@"OrderRow" inManagedObjectContext:context];
returnOrderHeader = originalTransactionHeader;
returnOrderRow = originalTransactionRow;
NSError *error = nil;
if(![context save:&error]) {
if([NWTillHelper isDebug] == 1) {
NSLog(@"Can't Delete! %@ %@", error, [error localizedDescription]);
return;
}
}
如果你指的这些行:
returnOrderHeader = originalTransactionHeader;
returnOrderRow = originalTransactionRow;
那些不进行复印。但它不是关于核心数据或托管对象的 - 当您详细介绍对象引用时,Objective-C不是如何工作的。当您有像NSManagedObject *returnOrderHeader
这样的声明时,*
意味着您要保存一个指向该对象的指针。复制指针值不复制对象数据,它复制指针值。你最终得到两个具有相同指针的变量,这意味着它们确实是同一个对象。
如果您想制作一个对象的副本,则需要执行额外的步骤。如果你的对象的类符合NSCopying
协议,那么你可以在对象上调用copy
。但是托管对象不这样做,因此您需要创建一个新实例,然后编写自己的代码以将旧实例的属性值复制到新实例。
得到它可以解释这些问题,所以基本上我需要创建一个新的空的ManagedObject,然后根据旧对象逐个设置值并将该新对象保存到上下文中。 –
没错。任何关系也需要重新创建。 –
关于这个问题的很多实验可以在这里找到:https://*.com/questions/2730832/how-can-i-duplicate-or-copy-a-core-data-managed-object – danh