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的工作。我将在下面粘贴代码。不幸的是,要求确实是有两个独立的实体。