0

我有两个实体:

  • 票务已解决

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

我正在考虑使用 Category: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.

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

4

2 回答 2

1

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

  • 摆脱TicketResolved
  • Ticket在named上添加一个布尔标志resolved,您可以YES在解决票证时设置该标志。
  • 使用此属性获取请求以获取已解决或未解决的票证,无论您需要哪种。

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

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

Ticket *ticket = [Ticket alloc]init];

您不能像那样创建托管对象,因为您没有调用指定的初始化程序。您需要使用-[NSManagedObject initWithEntity:insertIntoManagedObjectContext:]或使用+[NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:].

于 2013-10-10T16:32:18.170 回答
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;
于 2013-10-10T19:37:07.210 回答