2011-02-17 144 views
111

我可以用下面的代码轻松地获得一个物体的核心数据ID:如何从特定对象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]; 

不过,我想这样做的,不主动进行读取请求的方式。有任何想法吗?

+0

但是通过获取请求的方式,您可以设置预取的属性或关系,这将在您访问内容时为您提供卓越的效率,而不仅仅是更多的查询。 – malhal 2016-10-12 15:24:20

回答

197

你想:

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

从有ID,或者为零,如果不存在,实体店获取的对象。

(注意:有上的NSManagedObjectContext两种方法与我绊倒了似乎相似,名称以帮助他们保持笔直,这里就是另外两个做:

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

...将创建一个故障对象与提供的对象标识,这样的对象实际上是否存在于存储中,如果它不存在,任何引发故障的东西都将失败,除非先用NSManagedObjectContext的insertObject:来插入对象。我们发现这是在保存对象ID的同时将对象从存储中复制到存储中。

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

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

[eta .:第一种方法和另外两种方法的另一个重要区别是existingObjectWithID:error:永远不会返回错误;它总是为你提取整个对象。如果你试图避免这种情况发生(例如,使用具有大块属性的昂贵获取对象),那么你必须聪明地使用objectWithID:objectRegisteredForID:,它们不会触发故障;或使用正确配置的获取请求。]

+11

` - (NSManagedObject *)objectRegisteredForID:(NSManagedObjectID *)objectID`当您只想查看对象是否已经存在于上下文中而不想获取它时可能很有用。 – Tony 2012-01-21 02:01:40

2

objectWithID:是您正在查找的方法,并且这是推荐的方法。 objectWithID:将有效地使用NSManagedObjectContext来根据需要提取对象的级别 - 与其他方式不同。 objectWithID:将在转到备份存储之前正确使用父上下文,持久存储协调器和持久存储本身中的内存信息。

这将在WWDC 2012会话“核心数据最佳实践”中深入讨论。