如何获取只是对象的ID,但也包括CoreData的行数据?

在后台工作的CoreData Apple Docs中 ,我遇到了一些build议:

例如,您可以configuration一个获取请求来返回对象ID, 但也包含行数据(并更新行caching) – 如果您只是将这些对象ID从后台线程传递到另一个线程。

我想知道如何实现这个获取请求? 具体如何更新行caching。

认为这是如何得到只是ID:

NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"MyItem"]; // iOS 5 method request.returnsObjectsAsFaults = YES; 

我怎么做剩下的?

默认情况下,includesPropertyValues是YES,并且ReturnsObjectsAsFaults也是YES。

如果您只想返回对象ID,则需要使用…

 fetchRequest.resultType = NSManagedObjectIDResultType; 

但是,没有要读取的属性,行caching将不会被填充。 你将会得到一堆对象ID。

请注意,BY DEFAULT(resultType == NSManagedObjectResultType)既然包含了PropertyValues和returnsObjectsAsFaults,也是YES,所以fetch将返回对象作为错误(对象ID是可访问的),并且行caching将被填充 – 但是数据不会真正在内存中“,因为该对象仍然是一个错误…但你仍然可以得到它的对象ID。

所有你需要做的是然后问对象的对象ID。

所有这一切,我想,说你所要求的行为是默认情况下得到的。 那么,你有没有遇到问题,或者有什么理由认为你没有得到那种行为?

编辑

呃…我是说默认,你得到你想要的。 如果你只是填写一个提取请求,而不改变任何的属性,returnsObjectsAsFaults是YES – 所以返回给你的对象将是错误的。 此外,includesPropertyValues也是YES – 所以一些数量的属性数据将在行caching中可用。

您可以通过调用managedObject.objectID来访问objectID属性。

编辑

我很抱歉,因为我显然做得不好,因为这是我第三次说同样的话。

当你创build一个NSFetchRequest时,它有几个默认设置的属性。

resultType默认设置为NSManagedObjectResultType。 这意味着,除非你改变它,它仍然是NSManagedObjectResultType。 这也意味着你从一个fetch获得的结果数组将包含一个NSManagedObjects数组(而不是返回一个计数,或一个字典或ObjectIDs)。

returnsObjectsAsFaults默认设置为YES。 这意味着,除非你改变它,它仍然是YES。 这也意味着从取回返回的对象将是错误的。 NSManagedObject不会用属性数据来实现。 该对象将是一个错误。 它将有足够的元数据来知道它的types,对象ID和其他东西。

includesPropertyValues默认设置为YES。 这意味着,除非你改变它,它仍然是YES。 这也意味着一定数量的属性数据将被提取到行caching中。

从获取中返回的每个NSManagedObject将:

  1. 有一个对象ID
  2. 是一个错误,所以数据实际上并没有完全加载到内存中
  3. 一些数量的属性数据将在行caching中

这是你所要求的一切。 我不知道我还可以添加什么(不再重复自己)。

此外,请注意,如果您只需要对象ID,您可以将resultType设置为NSManagedObjectIDResultType。

直接从NSFetchRequest文档…

includesPropertyValues

您可以将includesPropertyValues设置为NO,通过避免创build表示属性值的对象来减less内存开销。 但是,如果您确定不需要实际的属性数据,或者已经有行caching中的信息,则通常只应该这样做,否则将导致多次访问数据库。

在正常提取期间(includesPropertyValues为YES),核心数据获取匹配logging的对象ID和属性数据,用信息填充行caching,并将被pipe理对象作为错误返回(请参阅returnsObjectsAsFaults)。 这些错误是pipe理对象,但是它们的所有属性数据仍然驻留在行caching中,直到错误被触发。 当错误被触发时,核心数据从行caching中检索数据 – 不需要返回到数据库。

如果includesPropertyValues为NO,那么核心数据仅获取匹配logging的对象ID信息 – 它不填充行caching。 核心数据仍然返回pipe理对象,因为它只需要pipe理对象ID来创build错误。 但是,如果随后引发错误,则Core Data将在(空)行高速caching中查找,找不到任何数据,然后再次返回存储以查找数据。

和…

returnsObjectsAsFaults

默认值是YES。 如果结果types(请参阅resultType)是NSManagedObjectIDResultType,则不使用此设置,因为对象ID不具有属性值。 如果您知道需要从返回的对象访问属性值,则可以将returnsObjectsAsFaults设置为NO来获得性能优势。

默认情况下,当你执行一个fetch时,returnsObjectsAsFaults是YES; 核心数据获取匹配logging的对象数据,用信息填充行caching,并返回pipe理对象作为故障。 这些错误是pipe理对象,但是它们的所有属性数据驻留在行caching中,直到错误被触发。 发生故障时,核心数据将从行caching中检索数据。 虽然这个操作的开销很小,但是对于大数据集来说,它可能变得不重要。 如果您需要从返回的对象中访问属性值(例如,如果遍历所有对象以计算特定属性的平均值),那么将returnsObjectsAsFaults设置为NO可以更有效地避免额外开销。

让我来解释一下这个简单的方法

默认情况下, NSFetchRequest

 resultType: NSManagedObjectResultType returnsObjectsAsFaults: YES includesPropertyValues: YES 

这里返回对象(在内存中)只有objectID属性,其他所有属性都是空的(这就是所谓的故障

includesPropertyValues

YES:表示对象属性在行caching中 (CoreData的一些特殊caching),所以当你访问这些属性时,CoreData将在行caching中寻找它们

NO:表示没有行caching,当你访问这些属性时,CoreData将再次查询SQLite

returnsObjectsAsFaults

是:允许includesPropertyValues有效(意味着允许错误

NO:将对象的所有属性返回到内存中

说明 :有两种故障: pipe理对象故障关系故障

阅读更多在这里错误限制对象图的大小

所以在你的情况下,只是玩默认