In the CoreData Apple Docs on working in the background,我发现了一些建议:
例如,您可以将获取请求配置为仅返回对象ID ,但也包括行数据(并更新行缓存) - 如果您要通过,这可能很有用从后台线程到另一个线程的那些对象ID。
我想知道如何实现此获取请求?具体如何更新行缓存。
我认为这就是获取ID的方式:
NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"MyItem"]; // iOS 5 method
request.returnsObjectsAsFaults = YES;
我该怎么办?
答案 0 :(得分:14)
默认情况下,includesPropertyValues为YES,returnObjectsAsFaults也为YES。
如果您只想返回对象ID,则需要使用...
fetchRequest.resultType = NSManagedObjectIDResultType;
但是,没有要提取的属性,并且不会填充行缓存。您将获得一堆对象ID。
注意,BY DEFAULT,(resultType == NSManagedObjectResultType),因为includesPropertyValues和returnsObjectsAsFaults都是YES,fetch会将对象作为错误返回(对象ID可访问),并且行缓存将被填充 - 但是数据不会真正成为记忆中的#34;因为对象仍然是一个错误...但你仍然可以获得它的对象ID。
然后,您需要做的就是询问对象的objectID。
我想,这就是说你要求的行为是你默认得到的。那么,您是否遇到问题,或者您是否认为自己没有这种行为?
修改强>
嗯......我说的是,通过默认,你得到了你想要的东西。如果您只是填写一个获取请求,并且没有更改任何属性,则返回对象AsFaults为YES - 因此返回给您的对象将是错误。此外,includesPropertyValues也是YES - 因此行缓存中将提供一些属性数据。您可以通过调用managedObject.objectID来访问objectID属性。
修改强>
我道歉,因为我显然没有很好地沟通,因为这将是我第三次说同样的话。
创建NSFetchRequest时,它有几个默认设置的属性。
默认情况下,resultType设置为NSManagedObjectResultType。这意味着,除非您更改它,它仍将是NSManagedObjectResultType。它还意味着从fetch获取的结果数组将包含NSManagedObjects数组(而不是返回计数,字典或ObjectID)。
默认情况下,returnsObjectsAsFaults设置为YES。这意味着,除非你改变它,它仍然是YES。它还意味着从获取返回的对象将是错误。 NSManagedObject将无法使用属性数据实现。对象将是一个错误。它将有足够的元数据来知道它的类型,对象ID和其他一些东西。
includesPropertyValues默认设置为YES。这意味着,除非你改变它,它仍然是YES。这也意味着将一些属性数据提取到行缓存中。
从获取返回的每个NSManagedObject都将:
这就是你要求的一切。我不确定我还能添加什么(不再重复我自己)。
另请注意,如果您只想要对象ID,可以将resultType设置为NSManagedObjectIDResultType。
直接来自NSFetchRequest文档...
<强> includesPropertyValues 强>
您可以将includesPropertyValues设置为NO以减少内存开销 避免创建表示属性值的对象。您 但是,如果您确定要么,那么通常应该这样做 不需要实际的属性数据,或者你已经拥有了 行缓存中的信息,否则您将产生多次旅行 到数据库。
在正常提取期间(includesPropertyValues为YES),核心数据 获取匹配记录的对象ID和属性数据, 使用信息填充行缓存,并返回托管对象 作为错误(请参阅returnsObjectsAsFaults)。管理这些故障 对象,但它们的所有属性数据仍驻留在行缓存中 直到故障发生。当故障被触发时,Core Data会检索 来自行缓存的数据 - 没有必要回到 数据库中。
如果includesPropertyValues为NO,则Core Data仅提取 匹配记录的对象ID信息 - 它不会填充 行缓存。核心数据仍然只返回托管对象 需要托管对象ID来创建故障。但是,如果你 随后触发故障,Core Data查找(空)行缓存, 没有找到任何数据,然后第二次回到商店 对于数据。
和...
<强> returnsObjectsAsFaults 强>
默认值为YES。如果结果类型,则不使用此设置 (请参阅resultType)是NSManagedObjectIDResultType,因为对象ID不是 有财产价值。您可以将returnsObjectsAsFaults设置为NO以获得 如果您知道需要访问该物业,则可获得性能优势 返回对象的值。
默认情况下,执行fetch返回时,对象AsFaults为YES; 核心数据获取匹配记录的对象数据,填充 行缓存信息,并将托管对象作为故障返回。 这些错误是托管对象,但是它们的所有属性数据 驻留在行缓存中,直到触发故障。当故障是 解雇后,Core Data会从行缓存中检索数据。虽然 对于大型数据集,此操作的开销很小 不平凡的。如果您需要从中访问属性值 返回的对象(例如,如果迭代所有对象 计算特定属性的平均值),然后是 将returnsObjectsAsFaults设置为NO以避免更高效 额外的开销。
答案 1 :(得分:6)
让我以简单的方式解释
默认情况下,NSFetchRequest
有
resultType: NSManagedObjectResultType
returnsObjectsAsFaults: YES
includesPropertyValues: YES
这里返回对象(在内存中)只有objectID
属性,所有其他属性都是空的(这就是所谓的错误)
<强> includesPropertyValues 强>
YES:表示对象属性位于行缓存(某些特殊情况 CoreData的缓存),这样当你访问那些属性时,就是CoreData 将在行缓存中查找它们
NO:表示当您访问这些属性时没有行缓存, CoreData将再次查询SQLite
<强> returnsObjectsAsFaults 强>
是:允许includePropertyValues生效(意味着允许错误)
NO:将对象的所有属性返回到内存
注意:有两种类型的错误:托管对象错误和关系错误
在此处阅读更多Faulting Limits the Size of the Object Graph
所以在你的情况下,只需使用默认的