NSFetchedResultsController为indexPathForObject返回nil

时间:2014-11-16 03:13:41

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

我的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个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];

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

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

修改

这是上面代码中使用的ourMeeting核心数据对象的打印输出示例:

<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>";
})

2 个答案:

答案 0 :(得分:-1)

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

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

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

答案 1 :(得分:-1)

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

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

  • targetDay nil?
  • targetDay.dayMeetings为空NSSet
  • 是获取的结果控制器nil?
  • 您是否忘记在FRC上致电performFetch
  • 您是否检查过FRC的上下文与您获取该对象的内容相同?
  • 您是否从用于放置它的相同提取结果控制器中获取对象?