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

时间:2011-02-17 21:44:55

标签: ios macos cocoa core-data nsfetchrequest

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

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

3 个答案:

答案 0 :(得分:203)

你想:

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

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

(请注意:NSManagedObjectContext上有两种方法,类似的名字让我感到沮丧。为了帮助他们保持正确,以下是其他两种方法:

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

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

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

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

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

答案 1 :(得分:3)

objectWithID:是您正在寻找的方法,建议您这样做。 objectWithID:将有效地使用NSManagedObjectContext将对象拉到所需的多个级别 - 与其他一些方法不同。在进入后备存储之前,objectWithID:将在父上下文,持久性存储协调器和持久性存储本身中正确使用内存中信息。

WWDC 2012会话“核心数据最佳实践”深入讨论了这一点。

答案 2 :(得分:0)

Swift 5版本:

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

还有方法object(with:)registeredObject(for:)。根据您的需要。