39

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

我正在使用 Core Data 进行存储。当文件夹的选择发生变化时,右表的 NSFetchedResultsController 的 fetch 谓词会发生变化并执行新的 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

4 回答 4

62

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

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

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

[NSFetchedResultsController deleteCacheWithName:@"Root"];  
于 2010-03-22T11:21:06.947 回答
3

这对我有用:

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

NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
    NSLog(@"%@, %@", error, [error userInfo]);
    abort();
} 
于 2016-05-18T08:45:22.363 回答
2

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

  • 在方法中创建相应的谓词(在 中configureCell:atIndexPath:调用tableView:cellForRowAtIndexPath:
  • 然后调用:
    [_fetchedResultsController.fetchRequest setPredicate:predicate];
    [_fetchedResultsController performFetch:nil];
  • 通过调用引用返回的对象[self.fetchedResultsController objectAtIndexPath:indexPath]
于 2015-11-02T17:16:47.910 回答
2

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

NSFetchedResultsController.deleteCache(withName: fetchedResultsController.cacheName)

于 2018-09-28T18:52:31.527 回答