CoreData:获取请求不获取最后插入的记录?或者如何强制刷新获取请求

Posted

技术标签:

【中文标题】CoreData:获取请求不获取最后插入的记录?或者如何强制刷新获取请求【英文标题】:CoreData: Fetch request does not fetch last inserted record? Or how to force refreshing a fetch request 【发布时间】:2014-03-04 00:27:55 【问题描述】:

我之前已经问过这个问题,但一直没有得到好的答案,所以我再次问了一遍,重新措辞,希望问题变得更清楚:

我有一个标签栏控制器 A,嵌入在导航控制器中。 第一个选项卡包含一个表格视图控制器 B,第二个选项卡包含一个带有核心图的视图控制器 C。 导航栏有一个 + 栏按钮,它以模态方式分隔视图控制器 D,用户在其中向核心数据添加新对象/记录。

table view controller D使用一个NSFetchedResultsController作为它的数据源,所以当用户从controller D返回时,新创建的对象会显示在table view中。

但是,如果用户点击第二个选项卡上的 + 栏按钮,并在模态分离视图控制器 D 中创建一个新对象/记录,然后返回到第二个选项卡,则不会更新核心绘图图。我进行了调查,发现为核心图提供数据的获取请求没有再次更新/执行。

那么,如何强制再次执行 fetch 请求?

视图控制器 D 中我的“完成”方法末尾的代码:

MRBMITabBarController *tabController = (MRBMITabBarController *) self.delegate;
NSArray *controllers = tabController.viewControllers;
MRBMIKurveViewController *kurveController = (MRBMIKurveViewController *) [controllers objectAtIndex:1];
kurveController.bmisForPlot = nil;
kurveController.bmisForPlot = [[kurveController fetchBmisForPlot] copy];
[kurveController.graph reloadData];
[kurveController.boundLinePlot reloadData];

[self.delegate dismissViewControllerAnimated:YES completion:nil];

但这不会刷新视图控制器 C 中的绘图,而是刷新表视图控制器 D 中的表视图。

注意:MRBMIKurveViewController 是视图控制器 C。

【问题讨论】:

【参考方案1】:

呼叫:

NSError *err = nil;
[managedObjectContext save:&err];

在您更改日期之后

在控制器的viewViewAppear 方法中调用您的重新加载数据方法

【讨论】:

【参考方案2】:

终于找到了解决办法:

MRBMITabBarController *tabController = (MRBMITabBarController *) self.delegate;
NSArray *controllers = tabController.viewControllers;
MRBMIKurveViewController *kurveController = (MRBMIKurveViewController *) [controllers objectAtIndex:1];

kurveController.bmisForPlot = [[kurveController fetchBmisForPlot] copy];
kurveController.dataForPlot = [kurveController testData3];
[kurveController.boundLinePlot reloadData];

[self.delegate dismissViewControllerAnimated:YES completion:nil];

基本上,在关闭视图控制器 D 之前,我会调用所有方法(通过委托),这些方法涉及在视图控制器 D 的“完成”方法中为绘图创建数据

【讨论】:

【参考方案3】:

为什么不在核心绘图视图 (C) 上使用单独的 fetchedResultsController 并将其用作绘图的数据源。不确定情节如何运作,因此您可能需要致电reloadData。您可能只需要实现一个 fetchedResultsController 委托方法controllerDidChangeContent 即可调用“reloadData”。

这样你的观点就完全相互独立了,一个甚至不需要知道另一个是否存在。你的方式 D 必须知道 C 的详细信息。现在你可以有一个后台线程更新数据,你的情节将自行更新。

【讨论】:

以上是关于CoreData:获取请求不获取最后插入的记录?或者如何强制刷新获取请求的主要内容,如果未能解决你的问题,请参考以下文章

iphone coredata 获取请求排序

Informix:如何获取最后插入记录的 id

如何获取 Core Data 数据库的最后一条记录?

当应用程序处于后台时,从推送通知中插入 coredata 记录

字符串的最后一部分未插入 coredata

coredata获取请求中的日期比较?