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

Posted

技术标签:

【中文标题】如何刷新/重新加载以更新对谓词的更改并因此获取请求?【英文标题】:How do I refresh/reload to update changes to my predicate & thus fetch request? 【发布时间】:2011-10-17 23:35:16 【问题描述】:

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

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

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

一旦完成输入订单的表单,按下按钮[保存订单],orderNumber 和 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:'

【问题讨论】:

【参考方案1】:

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

【讨论】:

是的,我已经在头文件中声明了委托,并且还具有控制器将更改内容的方法。当我在订单中添加和删除项目时,它会重新加载数据。我不认为我更改谓词,谓词保持不变,我只是更改它指向的值,即 OrderNumberLabel 中的值。我还根据时间戳进行了排序。我现在已经将缓存设置为 nil,这已经成功了。我将如何实施performFetch: 使用您的获取结果控制器,performFetch: 是它启动并从 Core Data 获取信息的原因。你仔细看过developer.apple.com/library/ios/#documentation/CoreData/…吗? 感谢 Adam,我已经通读了好几遍,但我是编程新手,需要一段时间才能深入了解,有时我不确定我是否采用了正确的方法这就是为什么您的投入很棒!我发现了问题,现在可以了!在我的 NSFetchedResultsController 代码开始时,我有 if (fetchedResultsController != nil) return fetchedResultsController; 这意味着其余代码不会运行来更新谓词:) 再次感谢您的输入【参考方案2】:

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

对此的解决方法是在 viewWillAppear 上调用 performFetch 和 reloadData。我知道效率不是很高 - 我需要添加一种机制,仅在数据实际更新时才执行此操作。

【讨论】:

【参考方案3】:

您想使用NSFetchedResultsController 来填充您的tableView。

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

NSFetchedResultsController 在后台监控你的 fetchRequest 并调用它的委托方法来响应事件。

【讨论】:

【参考方案4】:

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

[tableView 重新加载数据]

一个人没有做到,但感谢关于

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

在我的情况下,我通过在重新加载之前清除 fetchResultsController 来使其工作

_fetchedResultsController=nil;
[tableView reloadData];

谢谢msek!

【讨论】:

可能你还必须 [fetchedResultsController release] 之​​前将它归零。

以上是关于如何刷新/重新加载以更新对谓词的更改并因此获取请求?的主要内容,如果未能解决你的问题,请参考以下文章

使用新参数重新加载 Ajax 请求

vue.js 使用计时器自动重新加载/刷新数据

核心数据获取请求中需要谓词?

如何在 SwiftUI 列表中重新加载数据?

如何让 Firefox 在文件更改时自动刷新?

如何从列表视图中删除某些内容并重新加载页面?颤振网络