【问题标题】:Core data object copying核心数据对象复制
【发布时间】:2012-01-30 13:01:46
【问题描述】:

我在 NSManagedObject 上有一个子类,比如 Business。我有一些业务存储在核心数据中。 现在我通过

从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 对象的可变副本?

【问题讨论】:

标签: ios core-data nsmanagedobject


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-02-13
    • 1970-01-01
    • 2020-12-24
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多