我可以使用以下代码轻松获取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];
但是,我想以不启动自己的获取请求的方式执行此操作。有什么想法吗?
答案 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:)
。根据您的需要。