【问题标题】:NSFetchedResultsController returning nil for indexPathForObjectNSFetchedResultsController 为 indexPathForObject 返回 nil
【发布时间】:2014-11-16 03:13:40
【问题描述】:

我的FetchedResultsController (FRC) 设置如下:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"MTWMeeting" inManagedObjectContext:[NSManagedObjectContext MR_defaultContext]];
[fetchRequest setEntity:entity];

NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"meetingDay.dayTimestamp" ascending:YES];
NSSortDescriptor *sort2 = [[NSSortDescriptor alloc] initWithKey:@"meetingTimestamp" ascending:YES];
[fetchRequest setSortDescriptors:@[sort, sort2]];

NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[NSManagedObjectContext MR_defaultContext] sectionNameKeyPath:@"meetingDay.dayTimestamp" cacheName:nil];
self.fetchedResultsController = theFetchedResultsController;

我的数据库非常简单——我有一个MTWMeeting 实体和一个MTWDay 实体,可以举行多次会议。每次会议只能有 1 个家长日。

我的表格视图是由 1 个 MTWDay 实体为 1 个部分设置的标题。

现在我需要滚动到该单元格中的特定索引。

我是这样做的:

MTWDay *targetDay = [MTWCoreDataManager suitableDayForMeetingWithTimestamp:[date timeIntervalSince1970]];
MTWMeeting *ourMeeting = [targetDay.dayMeetings anyObject];

NSIndexPath *ourPath = [self.fetchedResultsController indexPathForObject:ourMeeting];
NSIndexPath *tmpPath = [NSIndexPath indexPathForRow:0 inSection:ourPath.section];

现在,无论我做什么,ourPathindex 路径始终是nil。但是,MTWDayMTWMeeting 对象是我从核心数据堆栈中获得的真实核心数据对象。

我有哪些步骤可以摆脱这种行为?我一直在努力解决这个问题好几天没有任何机会。

编辑:

这是上面代码中使用的ourMeeting Core Data 对象的示例打印输出:

<MTWDay: 0x1742a8d00> (entity: MTWDay; id: 0xd000000001780008 <x-coredata://B0F694E1-7A45-4D1E-BB26-6F0A929A135D/MTWDay/p94> ; data: {
    dayDisplayTitle = "\U0432\U043e\U0441\U043a\U0440\U0435\U0441\U0435\U043d\U044c\U0435";
    dayEvents = "<relationship fault: 0x170230da0 'dayEvents'>";
    dayID = nil;
    dayMeetings =     (
        "0xd000000003440002 <x-coredata://B0F694E1-7A45-4D1E-BB26-6F0A929A135D/MTWMeeting/p209>"
    );
    dayNumericID = 16;
    dayTimestamp = "1.416089e+09";
    daysMonth = "0xd000000000140006 <x-coredata://B0F694E1-7A45-4D1E-BB26-6F0A929A135D/MTWMonth/p5>";
})

【问题讨论】:

  • 您找到解决方案/解释了吗?

标签: cocoa-touch uitableview core-data nsfetchedresultscontroller nsindexpath


【解决方案1】:

您是否在没有错误的情况下执行了提取?

NSError *error;
[self.fetchedResultsController performFetch:&error];

如果有,请检查 ourMeeting 是否在 self.fetchedResultsController.fetchedObjects

【讨论】:

  • 嗯,没有错误,self.fetchedResultsController.fetchedObjects 确实包含我的对象。现在我想知道接下来会发生什么......
  • 你确定它是同一个对象,而不是两个具有相同数据的对象吗?您可以通过调用[self.fetchedResultsController.fetchedObjects containsItem:ourMeeting] 进行检查,看看是否返回 true。
  • 事实是,它确实返回真。我已经仔细检查过,甚至三次检查过
  • 你检查过你创建ourPath的方法吗?也许将 self.fetchedResultsController 设置为零?
  • 嗯,这也很奇怪,但不,完全没问题,FRC 不是 nil。
【解决方案2】:

您的获取结果控制器设置为没有谓词,因此它获取所有会议,因此相关会议应该在 FRC 的fetchedObjects 中。

在提供的代码范围内,您可以检查:

  • targetDay 为零吗?
  • targetDay.dayMeetings 是空的NSSet
  • 获取的结果控制器是否为零?
  • 您是否忘记在 FRC 上致电 performFetch
  • 您是否检查过 FRC 的 context 是否与您从中获取对象的那个相同?
  • 您是否从用于放置对象的同一个提取结果控制器获取对象?

【讨论】:

  • 正如对类似答案的评论中所述,令人惊讶的是,self.fetchedResultsController.fetchedObjects 包含ourMeeting。 FRC 不是 nil,我已经执行了 fetch。此外,我使用 MTWDay 对象的示例控制台打印编辑了我的帖子。
  • 请参阅我对上下文和获取结果控制器的编辑。
  • 我会仔细检查上下文,谢谢你的想法!
猜你喜欢
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 2014-11-11
相关资源
最近更新 更多