32

我正在一个屏幕上写两个表的应用程序。左表是文件夹列表,右表显示文件列表。当点击左侧的一行时,右侧的表格将显示属于该文件夹的文件。NSFetchedResultsController:更改谓词不起作用?

我正在使用Core Data进行存储。选择文件夹更改时,右表的NSFetchedResultsController的提取谓词将更改并执行新的提取,然后重新加载表数据。我用下面的代码片段:

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的“谓词”,并且他们对更新的信息是正确的。提取结果与初始提取保持相同(加载视图时)。我不是很熟悉核心数据获取对象的方式(是否有缓存系统?),但我之前做过类似的事情(更改谓词,重新获取数据和刷新表格)与单个表意见和一切进展顺利。

如果有人能给我一个提示,我会非常感激。

在此先感谢。

回答

55

我几乎正是这个问题,直到我发现了一丝非常最近的一篇博客在iphone incubator

NSFetchedResultsController是缓存的第一批成果。 (你可能有一些设置initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName)

我猜你的代码(像我的)是一个派生的CoreData示例,所以假设它是@“根”,在你改变谓词之前,做一个

[NSFetchedResultsController deleteCacheWithName:@"Root"]; 
+0

它的工作。谢谢! – 2010-03-23 10:09:53

+0

谢谢,这也解决了我的问题。虽然我没有得到相同的结果,但我在iOS 3.2/4.0中遇到了崩溃。它虽然在3.1工作正常! – 2010-06-22 17:36:21

+1

请注意,实体高速缓存保留_across应用程序runs_。我有一个非常混乱的时间,试图找出为什么在源代码中更改谓词本身对重建和运行应用程序没有任何影响。 Apple说:“如果它找到一个具有相同名称的缓存,控制器会测试缓存以确定它的内容是否仍然有效。控制器比较当前实体名称,实体版本哈希,排序描述符和节键路径与那些存储在缓存中“。请注意,该列表中的谓词不包含**。 – aroth 2014-04-28 00:57:37

1

在我的情况下,deafgreatdane的答案是行不通的;我做了什么,而不是可能是幼稚,但工作原理:

  • 创建于configureCell:atIndexPath:方法(称为tableView:cellForRowAtIndexPath:)的相应谓词(S)
  • 然后调用:
    [_fetchedResultsController.fetchRequest setPredicate:predicate];
    [_fetchedResultsController performFetch:nil];
  • 参考通过致电[self.fetchedResultsController objectAtIndexPath:indexPath]
1

这工作对我来说:

[NSFetchedResultsController deleteCacheWithName:nil]; 
[self.fetchedResultsController.fetchRequest setPredicate:predicate]; 

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