Core data 核心数据:使用类别复制NSManagedObject

Core data 核心数据:使用类别复制NSManagedObject,core-data,nsmanagedobject,objective-c-category,Core Data,Nsmanagedobject,Objective C Category,我有两个实体: 票 票务解决 两个实体具有相同的属性。将票据NSManagedObject复制到票据解决NSManagedObject的最有效方法是什么 我在考虑使用一个类别:Ticket+Copy是最便宜的方式吗?如果是这样,我将不得不在类别文件中导入票证和票证解决方案 这是我的想法,请有人告诉我这是不是正确的方法。我正在为每个实体使用NSManagedObjectSubclass 票证+副本中的方法: -(TicketResolved *)copyObjects:(Ticket *)ti

我有两个实体:

  • 票务解决
两个实体具有相同的属性。将
票据
NSManagedObject
复制到
票据解决
NSManagedObject
的最有效方法是什么

我在考虑使用一个类别:
Ticket+Copy
是最便宜的方式吗?如果是这样,我将不得不在类别文件中导入
票证和
票证解决方案

这是我的想法,请有人告诉我这是不是正确的方法。我正在为每个实体使用
NSManagedObjectSubclass

票证+副本中的方法

-(TicketResolved *)copyObjects:(Ticket *)ticket
{
     TicketResolved *ticketResolved = [NSEntityDescription insertNewObjectForEntityForName:@"TicketResolved" inManagedObjectContext:self.managedObjectContext];
     ticketResolved.attribute = ticket.attribute;
     // Assign rest of the ticketResolved attributes values this way
     return ticketResolved;
}
现在调用该方法

#import Ticket;
#import Ticket+Copy;

@implementation
....
Ticket *ticket = [NSEntityDescription insertNewObjectForEntityForName:@"Ticket" inManagedObjectContext:self.managedObjectContext];
TicketResolved *newTicketResolved = [ticket copyObjects:ticket];
// 'newTicketResolved' now has all the keys/values that 'ticket' had.

这是一种正确的方法还是有一种更简单的方法

如果
Ticket
TicketResolved
实际上具有相同的属性,则最有效的选项是:

  • 摆脱
    TicketResolved
  • 在名为
    resolved
    Ticket
    上添加一个布尔标志,可在解析Ticket时将其设置为
    YES
  • 使用此属性可以提取请求以获取已解析或未解析的票证,以您需要的为准
这样,您实际上就不需要复制任何数据,而且不做工作总是比做工作更有效率

如果出于某种原因,您确实需要两个具有相同属性的独立实体,基本上就是这样,那么您需要创建一个
TicketResolved
实例,并在每个属性值上复制代码。代码中唯一的主要问题是这样的行:

Ticket *ticket = [Ticket alloc]init];

您不能创建这样的托管对象,因为您没有调用指定的初始值设定项。您需要使用
-[NSManagedObject initWithEntity:InsertingManagedObjectContext:
或者使用
+[NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext::

多亏了@Tom,我纠正了问题中的错误

以下是对我有效的解决方案:

TicketResolved *ticketResolved = [NSEntityDescription insertNewObjectForEntityForName:@"TicketResolved" inManagedObjectContext:self.managedObjectContext];
NSArray *keys = [[[ticket entity] attributesByName] allKeys];
NSDictionary *dict= [ticket dictionaryWithValuesForKeys:keys];
[ticketResolved setValuesForKeysWithDictionary:dict];
上面的代码不复制关系对象。为此,我必须使用以下代码:

ticketResolved.relationshipObject = ticket.relationshipObject;

也许对你有用?谢谢你,汤姆。关于正在编写的代码,您是对的。我试图简化我的问题,但犯了一个错误。然而,我确实完成了我试图使用NSDictionary的工作。我将在下面粘贴代码。不幸的是,要求确实是有两个独立的实体。