我在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对象的可变副本?
答案 0 :(得分:3)
First Core Data没有可变和不可变对象的概念。您总是可以改变对象(在数据模型的约束范围内)。
其次,我们需要区分内存中的 和数据库中的副本。内存中的副本基本上会从内存地址A到内存地址B执行memncpy
个字节。这基本上是copy
和mutableCopy
在Objective-C中为我们提供的内容。数据库中的副本将创建现有行的副本。这些类型的副本之间的重要区别在于,第一个副本不会在数据库中创建副本。
简而言之,你不能在NSManagedObjects的内存副本中做。 NSManagedObject
(在本例中为Business)是数据库中的一行。因此,如果copy
和mutableCopy
在NSManagedObjects
上工作,则会创建多个对象,这些对象引用同一NSManagedObjectContext
数据库中的同一行。这没有多大意义,并且会产生比它解决的问题更多的问题。例如,如果您有两个NSManagedObject副本,并将名称更改为第一个@"Bar"
,第二个名称更改为@"Foo"
。然后在save
上致电NSManagedObjectContext
,将哪个值写为@"Foo"
或@"Bar"
?
要在数据库中创建副本,您需要创建Business的新实例并复制所有属性和关系并保存新对象。