NSFetchedResultsController:更改谓词不起作用?

时间:2010-03-20 05:46:43

标签: iphone uitableview core-data nspredicate nsfetchedresultscontroller

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

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

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获取对象的方式(有缓存系统吗?),但我之前用单表视图做过类似的事情(更改谓词,重新获取数据和刷新表)一切顺利。

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

提前致谢。

4 个答案:

答案 0 :(得分:56)

我几乎已经遇到了这个问题,直到我在iphone incubator

的最新博客文章中找到了提示。

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

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

[NSFetchedResultsController deleteCacheWithName:@"Root"];  

答案 1 :(得分:1)

就我而言,deafgreatdane的答案是行不通的;我做的事情可能是天真的,但有效:

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

答案 2 :(得分:1)

这对我有用:

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

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

答案 3 :(得分:1)

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

NSFetchedResultsController.deleteCache(withName: fetchedResultsController.cacheName)