6

文档状态:

...此方法始终返回一个对象。假定 objectID 表示的持久存储中的数据存在 - 如果不存在,则在您访问任何属性时(即触发故障时),返回的对象将引发异常。这种行为的好处是它允许您创建和使用故障,然后在以后或在单独的上下文中创建基础行。

在 Apple 的“Core Recipes”示例应用程序中,该方法的结果用于填充 NSFetchRequest,然后使用请求的结果,并带有注释:

 // first get the object into the context
 Recipe *recipeFault = (Recipe *)[context objectWithID:objectID];

 // this only creates a fault, which may NOT resolve to an object (for example, if the ID is for
 // an objec that has been deleted already):  create a fetch request to get the object for real
 NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
 [request setEntity: [NSEntityDescription entityForName:@"Recipe" inManagedObjectContext:context]];
 NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(self == %@)", recipeFault];
                    [request setPredicate: predicate];

我已经看到了许多objectWithID直接使用结果的示例(其他代码和苹果的“iClass”) - 意思是,它的属性被访问并愉快地处理。

应该objectWithID 始终被视为“可能存在”的对象吗?

我之所以问,是因为我刚刚遇到了这个问题,并没有反对它的存在。

4

2 回答 2

4

Apple 文档告诉您的是不要假设该对象存在是持久存储,只是因为返回了一个对象

你可以像对待它一样对待它,访问它的属性等等,因为在后台 Core Data 将访问数据存储来服务你的请求。但是,如果该对象在商店中不存在,则会出现异常。

这是 Apple 解释错误的文档(这objectWithID:是返回给您的内容)。

于 2011-01-29T12:42:05.650 回答
1

我发现这篇文章Safely fetching an NSManagedObject by URI包含一个很好的多合一方法来抓取对象,objectWithID:但如果发现它是错误的,则继续获取它。详细的方法在处理对象 URI 方面走得更远,但所介绍的核心技术是对这个问题的讨论的有用扩展。

于 2013-06-03T09:45:21.520 回答