如何从特定的对象ID获取核心数据对象?


120

我可以使用以下代码轻松地在Core Data中获取对象的ID:

NSManagedObjectID *moID = [managedObject objectID];

但是,是否有一种方法可以通过给它提供特定的对象ID将其从核心数据存储中移出?我知道我可以使用NSFetchRequest来做到这一点,就像这样:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Document" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(objectID = %@)", myObjectID];
[fetchRequest setPredicate:predicate];

但是,我想以一种不会启动自己的获取请求的方式来执行此操作。有任何想法吗?


但是,通过获取请求的方式,您可以将属性或关系设置为预取,这将为您带来出色的效率,而不是在您访问事物时提供更多查询。
malhal '16

Answers:


208

你要:

-(NSManagedObject *)existingObjectWithID:(NSManagedObjectID *)objectID
                                   error:(NSError **)error

从具有该ID的商店中获取对象,如果该对象不存在,则获取nil。

(请注意:NSManagedObjectContext上有两个名称类似的名称的方法让我大跌眼镜。为使它们保持一致,下面是另外两个方法的作用:

-(NSManagedObject *)objectWithID:(NSManagedObjectID *)objectID

...将使用提供的objectID创建故障对象,无论该对象实际上是否存在于商店中。如果不存在,则引发故障的所有操作都将失败,除非您首先使用NSManagedObjectContext的插入对象insertObject:。我发现的唯一用途是在保留ObjectID的同时从商店复制对象。

-(NSManagedObject *)objectRegisteredForID:(NSManagedObjectID *)objectID

...将返回具有该ID的对象(如果已通过此ManagedObjectContext从商店中获取)。如果有人知道此方法有什么用处,请发表评论。)

[eta。]:第一种方法与其他两种方法之间的另一个重要区别是,existingObjectWithID:error:从不返回错误;它总是为您获取整个对象。如果要避免这种情况(例如,使用具有大blob属性的昂贵的获取对象),则必须对objectWithID:或聪明一点,否则objectRegisteredForID:不会引发错误;或使用正确配置的提取请求。]


11
-(NSManagedObject *)objectRegisteredForID:(NSManagedObjectID *)objectID当您只想查看上下文中是否已存在某个对象并且不想获取它时,此功能很有用。
Tony

我的情况。在-tableView:didSelectRowAtIndexPath: UIAlertView上,显示是/否。在“是”上-有一些对象的工作。我NSFetchedResultsController从远程使用+后台CoreData更新。所以我不能存储对象:当警报显示在屏幕上时,可以更新存储并删除对象。我存储了objectId,然后在警报委托中再次检索它。因为我使用了NSFetchedResultsController-此时所有必需的对象已经在上下文中。此外,当上下文中没有对象时,CoreData不应使无用的临时获取成为可能。
kpower 2012年

很好的答案,谢谢!这些方法名称确实很棘手。很容易把所有的东西都弄错了
jackal

很好的答案,感谢您的澄清objectWithId:-在insertObject我尝试引发错误时,首先需要进行呼叫以防止引发异常的情况确实不明显。
Stanislav Pankevich

3
objectRegisteredForID:当您具有另一个上下文中的操作的objectID列表,并且只想更新本地上下文中可能具有过期数据的对象ID时,此功能很有用。这样可以检查对象图(并因此检查内存使用情况),它比循环-registeredObjects检查对象ID来查看对象是否因您的上下文而出错要好。
斯特林阿彻

4

objectWithID:是您要寻找的方法,这是推荐的方法。objectWithID:将有效地使用NSManagedObjectContext将对象拉入所需的尽可能多的级别-与某些其他方法不同。objectWithID:在转到后备存储之前,它将在父上下文,持久性存储协调器和持久性存储本身中正确使用内存中信息。

WWDC 2012会议“核心数据最佳实践”中对此进行了详细介绍。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.