如何获取对象ID,还包括CoreData中的行数据?

时间:2012-05-10 11:01:18

标签: iphone objective-c ios core-data nsfetchrequest

In the CoreData Apple Docs on working in the background,我发现了一些建议:

  

例如,您可以将获取请求配置为仅返回对象ID ,但也包括行数据(并更新行缓存) - 如果您要通过,这可能很有用从后台线程到另一个线程的那些对象ID。

我想知道如何实现此获取请求?具体如何更新行缓存。

认为这就是获取ID的方式:

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

我该怎么办?

2 个答案:

答案 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都将:

  1. 拥有对象ID
  2. 是一个错误,因此数据实际上并未完全加载到内存中
  3. 一些属性数据将位于行缓存中
  4. 这就是你要求的一切。我不确定我还能添加什么(不再重复我自己)。

    另请注意,如果您只想要对象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

所以在你的情况下,只需使用默认的