CoreData 查询最初在子对象上返回零休息 - 但在退出所有数据后

Posted

技术标签:

【中文标题】CoreData 查询最初在子对象上返回零休息 - 但在退出所有数据后【英文标题】:CoreData query returns zero rests on subObjects initially - but after quitting all the data exists 【发布时间】:2014-03-07 20:47:39 【问题描述】:

我正在使用 CoreData,我有一个名为 FlightRecording 的实体,其中包含一组消息 AhrsMesages。我在录制时遇到了奇怪的行为,然后在保存录音后,我会加载一张过去录音的表格,该表格应显示每个录音的消息数。然而,正在发生的是它显示 0 条消息。如果我退出应用程序并重新启动它并再次进入我的录制列表菜单,它将正确显示正确数量的子实体。

我在 PreviousFlightVC.m 的 ViewDidLoad 中使用以下代码来加载我的航班:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"FlightRecording"];

NSSortDescriptor *originSort =
        [[NSSortDescriptor alloc] initWithKey:@"originAirport" ascending:YES];

NSSortDescriptor *destinationSort =
        [[NSSortDescriptor alloc] initWithKey:@"destinationAirport" ascending:YES];

NSSortDescriptor *dateSort =
        [[NSSortDescriptor alloc] initWithKey:@"recordingStart" ascending:YES];


fetchRequest.sortDescriptors = @[originSort, destinationSort, dateSort];
[fetchRequest setIncludesSubentities:YES];

self.frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[self managedObjectContext] sectionNameKeyPath:nil cacheName:nil];

self.frc.delegate = self;
NSError *fetchingError = nil;
if ([self.frc performFetch:&fetchingError]) 
    NSLog(@"Success Fetch");
 else 
    NSLog(@"Fetch Error");

对于每个单元格,我都会生成这样的计数:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

RecordingRowCell *cell = nil;

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 

    /* - IPAD Version */
    cell = [tableView dequeueReusableCellWithIdentifier:@"RecordingRowCell"];
 else 

    /* Iphone table Cells */
    cell = [tableView dequeueReusableCellWithIdentifier:@"iphoneFlightCell"];


FlightRecording *rec = [[[self frc] fetchedObjects] objectAtIndex:[indexPath row]];

// Count the records
int recordCount = [rec.ahrsMessages count];
NSLog(@"%d", recordCount);

// ...

有人知道为什么我会看到这种行为吗?我能不能把“数据”留着写?任何建议都会很棒。这是一个小烦恼,但我仍然无法完全弄清楚它为什么会发生。

这是我的初始表格(退出前) - 注意 msgCount = 0

退出应用程序并重新启动后,这里是我的表 - 注意 msgCount = 6

【问题讨论】:

【参考方案1】:

NSFetchedResultsController 不会跟踪相关对象与其正在获取的对象的更改(在关系中)。

在您的情况下,对 ahrsMessages 集合的添加不会反映在当前获取的对象中。

无论如何,您在cellForRow... 中获取的计数在性能方面非常昂贵。 最好将计数存储在 FlightRecording 对象本身中。 每次您询问对象的计数时,它都需要解决一对多关系(去商店旅行)。

每次向录音添加消息时,增加相关录音对象中的录音计数(CoreData 无论如何都会出错)。 这也将使您的 FRC 听到更改并更新视图。

【讨论】:

以上是关于CoreData 查询最初在子对象上返回零休息 - 但在退出所有数据后的主要内容,如果未能解决你的问题,请参考以下文章

核心数据:未在子实体上创建复合索引

fork函数返回值问题

核心数据查询值“不是零”不返回值等于 0 的对象

我最初在我的应用程序中使用环境对象来管理我的应用程序中的状态,但现在需要 coreData。我应该删除环境对象吗?

关于fork()的学习

CoreData事务记录查询(Query)中NSPersistentHistoryTransaction.fetchRequest总返回nil的解决