5

一些背景:

我正在尝试将大量数据存储在本地数据库中,并且我希望尽可能高效地执行此操作。

设想:

有许多实体是相互关联的,例如地址与这样的联系人相关联:

地址 <<-> 联系人

为了管理关系,我在 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 的保存方法吗

请建议。

4

1 回答 1

11

首先,您不需要自己管理关系。让 CoreData 来处理。

当您访问故障中的数据时,Core Data 会自动解决(触发)故障。这种相关对象的延迟加载对于内存使用来说要好得多,对于获取与很少使用(或非常大)对象相关的对象来说要快得多。 核心数据性能

您可以通过简单地实例化联系人地址之间的一对多关系来做到这一点。

关于refreshObject:mergeChanges:你错了。它不等同于 save: 方法。如果将合并更改设置为 YES,则仅表示:

如果 flag 为 YES,则对象的属性值从存储中的值或上次缓存状态中重新加载,然后(在本地上下文中)所做的任何更改都将重新应用于那些(现在新更新的)值。 可可触摸文档

因此,如果您在托管对象 A 中进行了一些更改,然后进行了[context refreshObject:A mergeChanges:YES],那么对象 A 仍将保持未保存状态。

于 2013-02-14T08:47:12.827 回答