我可以用下面的代码中核心数据很容易地得到一个对象的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];
不过,我想这样做的,不主动进行读取请求的方式。 有任何想法吗?
你要:
-(NSManagedObject *)existingObjectWithID:(NSManagedObjectID *)objectID
error:(NSError **)error
获取从具有该ID,或零,如果它不存在,商店中的对象。
(注意:有上的NSManagedObjectContext两种方法与我绊倒了似乎相似,名称以帮助他们保持笔直,这里就是另外两个做:
-(NSManagedObject *)objectWithID:(NSManagedObjectID *)objectID
...将创建与所提供的objectID故障对象,这种对象是否真正在商店存在。 如果它不存在,任何火灾,故障会,除非你的NSManagedObjectContext首款插入对象失败insertObject:
唯一的使用,我发现这是从店面复制对象,同时保留的ObjectID存储。
-(NSManagedObject *)objectRegisteredForID:(NSManagedObjectID *)objectID
...将返回有一个ID, 如果它已经从商店这个managedObjectContext获取的对象。 如果有人知道这种方法是有用的,请评论。)
的η:第一种方法,另外两个之间的另一个重要区别是, existingObjectWithID:error:
从未返回一个故障; 它总是获取整个对象为您服务。 如果你想避免这种情况(例如,有工作昂贵到取一个大斑点属性对象),你必须要巧妙搭配objectWithID:
或objectRegisteredForID:
这不火的故障; 或使用适当配置的提取请求。]
objectWithID:
就是你正在寻找的方法,它是做到这一点的推荐方式。 objectWithID:
将有效地使用的NSManagedObjectContext拉对象只为多层次的需要-不像有些这样做的其他方式。 objectWithID:
将正确使用内存中的父上下文信息,持久存储协调,以及本身才去后备存储持久性存储。
这是覆盖在深度在WWDC 2012届“核心数据的最佳实践”。