某些背景:
我正在尝试将大量数据存储在本地数据库中,我希望尽可能高效地进行此操作。
情境:
有许多实体是相互关联的,例如地址与这样的联系人相关联:
地址<< - >接触
为了管理关系,我在NSManagedObject的每个子类中编写了一个方法,下面是一些代码片段:
// class Contact
- (void)manageRelationships
{
@autoreleasepool {
LocalDBManager *localDBManager = [[LocalDBManager alloc] init];
// managing relationships
// map associated addresses
NSPredicate *addressIdPredicate = [NSPredicate predicateWithFormat:@"%K == %@",ADDRESSID,self.addressid];
// below method returns an object as fault by firing a fetch request against context
NSSet *retrievedAddresses = [localDBManager retrieveManagedObjectsForEntity:ADDR_ENTITY withPredicate:addressIdPredicate asFault:YES withPropertyValues:NO error:nil];
self.addresses = retrievedAddresses;
// managing few more relationships
}
}
需要考虑的事项:
由于对象可以有多个关系,我知道在映射关系时内存消耗会增加。
问题:
一旦关系被映射,我想把一个对象变成错误而不会丢失所做的任何更改。
从苹果文档和一些谷歌搜索,我发现我可以使用 refreshObject:mergeChanges:方法。所以我打算在manageRelationships方法的代码块末尾添加以下行:
[[self managedObjectContext] refreshObject:self mergeChanges:YES];
我有点困惑,想知道 -
这是否意味着对对象进行的任何更改都将是 存储在持久存储中然后该对象将转为故障? 如果是,那么我可以认为它等同于保存方法 的NSManagedObjectContext
请建议。
答案 0 :(得分:11)
首先,您不需要自己管理关系。让CoreData处理它。
当您访问故障中的数据时,Core Data会自动解决(触发)故障。这个懒加载 相关对象对于内存使用要好得多,并且获取与很少使用相关的对象要快得多 (或非常大的)物体。 CoreData performance
您可以通过简单地实例化联系地址之间的一对多关系来实现此目的。
关于 refreshObject:mergeChanges:,你错了。它不等同于save:方法。如果将合并更改设置为YES,则仅表示:
如果flag为YES,则从商店或最后一个缓存状态的值重新加载对象的属性值,然后在这些(现在新更新的)值上重新应用所做的任何更改(在本地上下文中)。 Cocoa touch Doc
因此,如果您在托管对象A中进行了一些更改,然后 [context refreshObject:A mergeChanges:YES] ,则对象A仍将保持未保存状态。