【问题标题】:Using NSPredicate with Core Data NSFetchedResultsController将 NSPredicate 与核心数据 NSFetchedResultsController 一起使用
【发布时间】:2011-01-06 03:14:18
【问题描述】:

我有一个 fetchedResultsController,它返回了我的实体“Account”的所有记录。

我想快速搜索所有 Account 记录中的属性“lastName”== value,并返回 Account 对象,或者至少返回 fetchedResultsController 中对象的 indexPath。应该只返回 1 个对象。

除了遍历每个 objectAtIndexPath,还有没有更好的方法来使用 NSPredicate 搜索 fetchController?

【问题讨论】:

    标签: iphone core-data nspredicate


    【解决方案1】:

    mootymoots,只需使用另一个谓词过滤获取的对象...

    NSPredicate *lastNameMatch = ...
    NSArray *matchingFetchedObjects = [fetchedResultsController.fetchedObjects filteredArrayUsingPredicate:lastNameMatch];
    

    这使您的fetchedResultsController 结果保持不变,但为您提供了一个匹配姓氏谓词的数组。

    【讨论】:

      【解决方案2】:
      NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
      // set up fetch request
      ...
      NSPredicate *requestPredicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(lastName like '%@')", self.lastName]];
      [fetchRequest setPredicate:requestPredicate];
      ...
      // perform fetch
      NSError *error = nil;
      if (![self.fetchedResultsController performFetch:&error]) { 
          // handle error...
      }
      
      ...
      
      Account *uniqueAccount = [[self.fetchedResultsController fetchedObjects] anyObject]; // assuming lastName attribute is unique
      

      【讨论】:

      • 谢谢亚历克斯 - 所以你是说我应该忽略构建我的 NSTableView 的已经设置的 fetchedResultsController,并为此创建一个额外的?我想我的意思是,我不能对 fetchedResultsController 中已经检索到的 Account 对象执行 NSPredicate?
      • 是的,您可以将谓词应用于现有的NSSetNSArray。不,您不需要创建额外的 FRC。见:theocacao.com/document.page/346