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

我可以使用以下代码轻松获取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]; 

但是,我想这样做不会启动自己的获取请求。 有任何想法吗?

你要:

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

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

(注意:在NSManagedObjectContext上有两个方法,类似的名字使我不知所措,为了保持直线,下面是其他两个方法:

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

…将使用提供的objectID创build一个故障对象, 不pipe这个对象是否真的存在于商店中。 如果它不存在,任何引发错误的东西都将失败,除非先用NSManagedObjectContext的insertObject:插入对象。 我发现的唯一用途是将对象从存储区复制到存储区,同时保留ObjectID。

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

…将返回具有该ID的对象, 如果已通过此managedObjectContext从存储中获取该对象。 如果有人知道这个方法是有用的,请发表评论。)

[eta .:第一个方法和另外两个之间的另一个重要区别是existingObjectWithID:error:永远不会返回一个错误; 它总是为你提取整个对象。 如果你试图避免这种情况(比如使用一个blob属性的昂贵的对象),你必须聪明的使用objectWithID:或者objectRegisteredForID: objectWithID:它不会触发错误; 或使用正确configuration的获取请求。]

objectWithID:是您正在查找的方法,并且这是推荐的方法。 objectWithID:将有效地使用NSManagedObjectContext来拉动对象,只要根据需要多层次 – 不像其他一些手段这样做。 在转到后备存储之前, objectWithID:将正确使用父上下文中的内存信息,持久存储协调器和持久存储本身。

这在WWDC 2012会议“核心数据最佳实践”中有深入的介绍。