如何从特定的对象ID获取Core Data对象?

Jas*_*son 117 macos cocoa core-data nsfetchrequest ios

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

NSManagedObjectID *moID = [managedObject objectID];
Run Code Online (Sandbox Code Playgroud)

但是,是否有办法通过为对象提供特定的对象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];
Run Code Online (Sandbox Code Playgroud)

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

rge*_*rge 204

你要:

-(NSManagedObject *)existingObjectWithID:(NSManagedObjectID *)objectID
                                   error:(NSError **)error
Run Code Online (Sandbox Code Playgroud)

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

(请注意:NSManagedObjectContext上有两种方法,它们具有相似的名称,使我绊倒.为了帮助它们保持正确,这是其他两种方法的作用:

-(NSManagedObject *)objectWithID:(NSManagedObjectID *)objectID
Run Code Online (Sandbox Code Playgroud)

...将使用提供的objectID创建一个故障对象,无论这个对象是否实际存在于商店中.如果它不存在,除非您首先使用NSManagedObjectContext插入对象,否则触发该错误的任何内容都将失败insertObject:.我发现的唯一用途是在保留ObjectID的同时将对象从一个商店复制到另一个商店.

-(NSManagedObject *)objectRegisteredForID:(NSManagedObjectID *)objectID
Run Code Online (Sandbox Code Playgroud)

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

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

  • ` - (NSManagedObject*)objectRegisteredForID:(NSManagedObjectID*)objectID`在您只想查看对象是否已存在于上下文中并且不想获取它时可能很有用. (11认同)
  • 当您从另一个上下文中的操作获得一个objectID列表时,`objectRegisteredForID:`非常有用,并且您只想更新可能在本地上下文中具有过时数据的那些.这样可以检查对象图(以及内存使用情况),并且它比循环遍历`-registeredObjects`并检查objectID更好,以查看对象是否出现上下文故障. (3认同)

que*_*ish 5

objectWithID:是您正在寻找的方法,这是执行此操作的推荐方法。objectWithID:将有效地使用 NSManagedObjectContext 仅根据需要拉取对象的级别 - 与执行此操作的其他一些方法不同。objectWithID:在进入后备存储之前,将正确使用父上下文、持久存储协调器和持久存储本身中的内存信息。

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