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

时间:2013-10-09 01:25:32

标签: core-data nsmanagedobject objective-c-category

我有两个实体:

  • 票务
  • TicketResolved

两个实体都具有相同的属性。将Ticket NSManagedObject复制到TicketResolved NSManagedObject的最有效方法是什么?

我在考虑使用类别:Ticket+Copy是最便宜的方式吗?如果是这样,我必须在类别文件中#import TicketTicketResolved

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

Ticket+Copy中的方法:

-(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.

这是一种正确的方法还是有更简单的方法来做到这一点?

2 个答案:

答案 0 :(得分:1)

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

  • 摆脱TicketResolved
  • 在名为Ticket的{​​{1}}上添加一个布尔标志,您可以在故障单解析后设置为resolved
  • 使用此属性获取请求以获取已解决或未解决的故障单,无论您需要哪个。

然后你实际上并不需要复制任何数据,而且不做工作总是比这样做更有效。

如果由于某种原因你真的想要两个具有相同属性的独立实体,基本上你拥有它,你需要创建一个YES实例并让你的代码复制每个属性值。您的代码唯一的主要问题是这样的行:

TicketResolved

您无法创建这样的托管对象,因为您没有调用指定的初始化程序。您需要使用Ticket *ticket = [Ticket alloc]init]; 或使用-[NSManagedObject initWithEntity:insertIntoManagedObjectContext:]

答案 1 :(得分:0)

感谢@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;