核心数据对象复制

时间:2011-12-30 12:02:01

标签: ios core-data nsmanagedobject

我在NSManagedObject上有一个子类说Business。我有一些企业存储在Core Data中。 现在我通过

从Core Data获取所有业务
 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
 NSEntityDescription *entity = [NSEntityDescription  entityForName:@"Business" inManagedObjectContext:[Model sharedInstance].managedObjectContext];
 [fetchRequest setEntity:entity];

 NSError* error = nil;
 NSMutableArray * businesses = (NSMutableArray*)[self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
 [fetchRequest release];

如果我想拥有任何一个业务对象的副本,我会这样做:

Business *tempBusiness = [[businesses objectAtIndex:0] mutableCopy];

此时,我收到一个错误  “[Business copyWithZone]无法识别的选择器”

为什么我收到此错误。或者有没有办法创建Core Data对象的可变副本?

1 个答案:

答案 0 :(得分:3)

First Core Data没有可变和不可变对象的概念。您总是可以改变对象(在数据模型的约束范围内)。

其次,我们需要区分内存中的 和数据库中的副本。内存中的副本基本上会从内存地址A到内存地址B执行memncpy个字节。这基本上是copymutableCopy在Objective-C中为我们提供的内容。数据库中的副本将创建现有行的副本。这些类型的副本之间的重要区别在于,第一个副本不会在数据库中创建副本。

简而言之,你不能在NSManagedObjects的内存副本中做。 NSManagedObject(在本例中为Business)是数据库中的一行。因此,如果copymutableCopyNSManagedObjects上工作,则会创建多个对象,这些对象引用同一NSManagedObjectContext数据库中的同一行。这没有多大意义,并且会产生比它解决的问题更多的问题。例如,如果您有两个NSManagedObject副本,并将名称更改为第一个@"Bar",第二个名称更改为@"Foo"。然后在save上致电NSManagedObjectContext,将哪个值写为@"Foo"@"Bar"

要在数据库中创建副本,您需要创建Business的新实例并复制所有属性和关系并保存新对象。