2017-05-30 171 views
0

我试图复制一个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; 
    } 
} 
+0

关于这个问题的很多实验可以在这里找到:https://stackoverflow.com/questions/2730832/how-can-i-duplicate-or-copy-a-core-data-managed-object – danh

回答

1

如果你指的这些行:

returnOrderHeader = originalTransactionHeader; 
returnOrderRow = originalTransactionRow; 

那些不进行复印。但它不是关于核心数据或托管对象的 - 当您详细介绍对象引用时,Objective-C不是如何工作的。当您有像NSManagedObject *returnOrderHeader这样的声明时,*意味着您要保存一个指向该对象的指针。复制指针值不复制对象数据,它复制指针值。你最终得到两个具有相同指针的变量,这意味着它们确实是同一个对象。

如果您想制作一个对象的副本,则需要执行额外的步骤。如果你的对象的类符合NSCopying协议,那么你可以在对象上调用copy。但是托管对象不这样做,因此您需要创建一个新实例,然后编写自己的代码以将旧实例的属性值复制到新实例。

+0

得到它可以解释这些问题,所以基本上我需要创建一个新的空的ManagedObject,然后根据旧对象逐个设置值并将该新对象保存到上下文中。 –

+0

没错。任何关系也需要重新创建。 –

相关问题