【问题标题】:NSFetchedResultsController: changing predicate not working?NSFetchedResultsController:更改谓词不起作用?
【发布时间】:2011-01-29 17:45:18
【问题描述】:

我正在编写一个在一个屏幕上包含两个表格的应用程序。左表是文件夹列表,右表显示文件列表。当点击左侧的一行时,右侧的表格将显示属于该文件夹的文件。

我正在使用 Core Data 进行存储。当文件夹的选择发生变化时,右表的 NSFetchedResultsController 的 fetch 谓词会发生变化并执行新的 fetch,然后重新加载表数据。我使用了以下代码sn-p:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"list = %@",self.list];
[fetchedResultsController.fetchRequest setPredicate:predicate];
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {   
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}
[table reloadData];

但是抓取结果还是一样的。在获取之前和之后,我已经 NSLog'ed “谓词”,并且它们对于更新的信息是正确的。提取结果与初始提取相同(加载视图时)。

我对 Core Data 获取对象的方式不是很熟悉(有缓存系统吗?),但我之前用单表视图做过类似的事情(更改谓词、重新获取数据和刷新表)一切顺利。

如果有人能给我一个提示,我将不胜感激。

提前致谢。

【问题讨论】:

    标签: iphone uitableview core-data nspredicate nsfetchedresultscontroller


    【解决方案1】:

    在我的 swift 项目中遇到了类似的问题。这对我有用

    NSFetchedResultsController.deleteCache(withName: fetchedResultsController.cacheName)

    【讨论】:

      【解决方案2】:

      这对我有用:

      [NSFetchedResultsController deleteCacheWithName:nil];  
      [self.fetchedResultsController.fetchRequest setPredicate:predicate]; 
      
      NSError *error = nil;
      if (![self.fetchedResultsController performFetch:&error]) {
          NSLog(@"%@, %@", error, [error userInfo]);
          abort();
      } 
      

      【讨论】:

      • 只需设置谓词并再次执行提取就可以了
      【解决方案3】:

      就我而言,deafgreatdane 的回答不起作用;我所做的可能是幼稚的,但有效:

      • configureCell:atIndexPath: 方法中创建相应的谓词(在tableView:cellForRowAtIndexPath: 中调用)
      • 然后拨打:
        [_fetchedResultsController.fetchRequest setPredicate:predicate];
        [_fetchedResultsController performFetch:nil];
      • 通过调用[self.fetchedResultsController objectAtIndexPath:indexPath]引用返回的对象

      【讨论】:

        【解决方案4】:

        我几乎完全遇到了这个问题,直到我在iphone incubator最近的一篇博客文章中找到了提示

        NSFetchedResultsController 正在缓存第一个结果。 (你可能在 initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName 设置了一些东西)

        我猜你的代码(和我的一样)是 CoreData 样本的派生,所以假设它是 @"Root",在你改变谓词之前,做一个

        [NSFetchedResultsController deleteCacheWithName:@"Root"];  
        

        【讨论】:

        • 谢谢,这也解决了我的问题。但是我没有得到相同的结果,我在 iOS 3.2/4.0 中遇到了崩溃。它在 3.1 中运行良好!
        • 请注意,实体缓存会在应用程序运行时保留。我花了很长时间试图弄清楚为什么在源代码中更改谓词本身对重建和运行应用程序没有任何影响。 Apple 表示:“如果找到同名的缓存,控制器会测试缓存以确定其内容是否仍然有效。控制器会比较当前实体名称、实体版本哈希、排序描述符和部分 key-path与那些存储在缓存中的”。请注意,谓词不包括在该列表中。
        • 更便携的版本,可以传入cacheNameNSFetchedResultsController<NSFetchRequestResult>.deleteCache(withName: fetchedResultsController.cacheName)[NSFetchedResultsController deleteCacheWithName: [fetchedResultsController cacheName]]
        • 为我工作!谢谢!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-24
        • 1970-01-01
        相关资源
        最近更新 更多