我有两个实体:
两个实体都具有相同的属性。将Ticket
NSManagedObject
复制到TicketResolved
NSManagedObject
的最有效方法是什么?
我在考虑使用类别:Ticket+Copy
是最便宜的方式吗?如果是这样,我必须在类别文件中#import
Ticket
和TicketResolved
。
这是我想出的,有人可以告诉我这是不是正确的方法。我正在为每个实体使用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.
这是一种正确的方法还是有更简单的方法来做到这一点?
答案 0 :(得分:1)
如果Ticket
和TicketResolved
实际上具有相同的属性,则最有效选项是:
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;