如何刷新/重新加载以更新对谓词的更改&因此获取请求?

时间:2011-10-17 23:35:16

标签: iphone objective-c uitableview nspredicate nsfetchedresultscontroller

您好我目前有一个表格视图,正在通过Core Data填充。

我使用NSPredicate限制结果,以便只有具有相同OrderNumber的项目才会显示在tableView中。

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                                @"orderNumber == %@",     orderNumberLabel.text];
NSLog(@"predicate is: %@",predicate);
[fetchRequest setPredicate:predicate];

完成订单输入表格后,按下按钮[保存订单],然后将orderNumber加1,以及orderNumberLabel。

我期望发生的是tableView应该为空,因为新的orderNumber在sql数据库中没有条目。但是这不会发生并调用[myTableView reloadData];也解决不了。

但是,如果我退出项目并重新运行它,我会使用新的orderNumber和一个空的tableView。因此,在运行时发生了一些事情,其中​​设置了获取请求和谓词,我需要尝试&在我的saveOrderButtonPressed方法中调用复制。唯一的问题是我不知道该怎么做,有人可以帮忙吗?

偶尔在输入订单后退出并重新运行应用程序后,我也遇到以下错误。它与我更改orderNumber有关,但我认为一旦我更新谓词/ fetchRequest它就会消失。我还需要一些指导,我需要禁用缓存吗?

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException',
reason:'FATAL ERROR: The persistent cache of section information does not match 
the current configuration.  You have illegally mutated the NSFetchedResultsController's
fetch request, its predicate, or its sort descriptor without either disabling 
caching or using +deleteCacheWithName:'

4 个答案:

答案 0 :(得分:7)

您使用NSFetchedResultsController是对的。它完全是为您描述的用途而制作的。 正如错误消息所示,您可以将NSFetchedResultsController的缓存设置为nil以完全禁用缓存 - 当您拥有的项目非常少时,不会产生很大的性能损失。或者,您可以将+deleteCacheWithName:与您分配给缓存的名称一起使用。只有这样才能更改获取请求(例如谓词),然后您必须再次执行performFetch:。希望您将代理连接起来,以便自动刷新表视图。 你没有说你正在做任何会导致问题的事情(改变谓词,排序等等) - 你确定你不是吗?

答案 1 :(得分:2)

我发现Adam的回复很有帮助 - 谢谢。我有一个类似的问题,我正在使用具有公共上下文的NSFetchedResultsControllers进行更新。可以从几个表视图中更新(更改 - 不添加或删除)数据,但更改未反映在另一个视图中。

对此的修复是在viewWillAppear上调用performFetch AND reloadData。我知道效率不高 - 我需要添加一种机制,只在数据实际更新时才这样做。

答案 2 :(得分:0)

您想使用NSFetchedResultsController填充tableView。

您可以实现NSFetchedResultsControllerDelegate方法来指定tableView应如何更新以响应各种事件。

NSFetchedResultsController在后台监视您的fetchRequest并调用其委托方法以响应事件。

答案 3 :(得分:0)

我有类似的情况,我想用不同的谓词更新表。

[tableView realoadData]

单独没有这样做,但感谢关于

的提示
(fetchedResultsController != nil) { return fetchedResultsController; } 

我通过在我的情况下重新加载之前清除fetchResultsController来实现它

_fetchedResultsController=nil;
[tableView reloadData];

谢谢msek!