125

我可以使用以下代码在 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];

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

4

3 回答 3

211

你要:

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

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

(请注意:在 NSManagedObjectContext 上有两种方法,它们的名称看起来很相似,这让我大吃一惊。为了帮助它们保持直截了当,其他两个方法如下:

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

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

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

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

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

于 2011-02-17T22:11:48.553 回答
5

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

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

于 2014-08-07T01:20:29.633 回答
3

斯威夫特 5 版本:

https://developer.apple.com/documentation/coredata/nsmanagedobjectcontext/1506686-existingobject

还有方法object(with:)registeredObject(for:). 取决于你需要什么。

于 2019-07-06T10:13:16.483 回答