是不是不能复制一个核心数据NSManagedObject?

Posted

技术标签:

【中文标题】是不是不能复制一个核心数据NSManagedObject?【英文标题】:Is not not possible to copy a core data NSManagedObject? 【发布时间】:2017-05-30 21:55:31 【问题描述】:

我正在尝试复制一个包含核心数据实例的 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;
   

【问题讨论】:

这里有很多关于这个主题的实验:***.com/questions/2730832/… 【参考方案1】:

如果您指的是这些行:

returnOrderHeader = originalTransactionHeader;
returnOrderRow = originalTransactionRow;

那些不复制。但这与核心数据或托管对象无关——当您使用对象引用进行详细说明时,这不是 Objective-C 的工作方式。当你有一个像NSManagedObject *returnOrderHeader 这样的声明时,* 意味着你正在保存一个指向对象的指针。复制指针值不会复制对象数据,它会复制指针值。你最终会得到两个具有相同指针的变量,这意味着它们实际上是同一个对象。

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

【讨论】:

得到它可能会解释问题,所以基本上我需要创建一个新的空 ManagedObject,然后基于旧对象一个一个设置值并将该新对象保存到上下文中 没错。任何关系也需要重新创建。

以上是关于是不是不能复制一个核心数据NSManagedObject?的主要内容,如果未能解决你的问题,请参考以下文章

NSManagedObject 保存在核心数据中但属性错误

核心数据中是不是使用了可选属性? [复制]

要保存在服务器中的核心数据的唯一 ID

NSManagedObject:在单独的线程上创建

当其中一种数据类型可以为空而另一种不能为空时,是不是可以使用 linq 进行匿名连接? [复制]

使用核心 .NET 在 C# 中编写 JSON 消息? [复制]