Objective c 无法复制核心数据NSManagedObject吗?
我试图复制一个包含核心数据实例的NSManagedObject,但这样做时,我会有一些非常奇怪的行为,就像复制后对象以某种方式相互链接,对其中一个对象的更改也会影响另一个对象Objective c 无法复制核心数据NSManagedObject吗?,objective-c,core-data,Objective C,Core Data,我试图复制一个包含核心数据实例的NSManagedObject,但这样做时,我会有一些非常奇怪的行为,就像复制后对象以某种方式相互链接,对其中一个对象的更改也会影响另一个对象 NSManagedObject *originalTransactionRow = [self.transactionRowsRows objectAtIndex:indexPath.row]; NSManagedObject *originalTransactionHeader = [self.transactionRo
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
。但是托管对象不能做到这一点,因此您需要创建一个新实例,然后编写自己的代码将属性值从旧实例复制到新实例。如果您正在引用以下行:
returnOrderHeader = originalTransactionHeader;
returnOrderRow = originalTransactionRow;
那些不是复制品。但这与核心数据或托管对象无关——当您使用对象引用进行详细说明时,Objective-C并不是这样工作的。当您有类似于NSManagedObject*returnOrderHeader
的声明时,*
表示您正在保存指向该对象的指针。复制指针值不会复制对象数据,而是复制指针值。最后两个变量的指针相同,这意味着它们实际上是同一个对象
如果要制作对象的副本,则需要执行额外的步骤。如果对象的类符合
NSCopying
协议,那么您可以对对象调用copy
。但是托管对象不能做到这一点,因此您需要创建一个新实例,然后编写自己的代码将属性值从旧实例复制到新实例。明白了,这可能会解释问题,因此,基本上我需要创建一个新的空ManagedObject,然后根据旧对象逐个设置值,并将新对象保存到Context,没错。任何关系也需要重新创建。明白了,这可能会解释问题,所以基本上我需要创建一个新的空ManagedObject,然后根据旧对象逐个设置值,并将新对象保存到ContextIt’s right。任何关系也需要重新建立。关于这个主题的大量实验可以在这里找到:关于这个主题的大量实验可以在这里找到: