Iphone NSFetchedResultsController-幻影行

Iphone NSFetchedResultsController-幻影行,iphone,xcode,core-data,Iphone,Xcode,Core Data,只是遇到了一个棘手的NSFetchedResultsController问题 下面的代码在所有情况下都可以正常工作,除了核心数据数据库报告2行时的第一个条目 id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section]; numberOfRows = [sectionInfo numberOfObjects]; 我可以看到有1个插入

只是遇到了一个棘手的NSFetchedResultsController问题

下面的代码在所有情况下都可以正常工作,除了核心数据数据库报告2行时的第一个条目

id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
numberOfRows = [sectionInfo numberOfObjects];
我可以看到有1个插入和2个选择

此外,如果我已经访问了包含NSFetchedResultsController代码的视图(即在执行插入之前),那么这个问题似乎不会发生

==
更新1:
不知道此代码演练是否有助于…
1.ViewController A启动进行下载的后台操作
2.完成后,将向AppDelegate发送通知
3.当AppDelegate收到此通知时,它将导入数据(在执行此操作之前进行检查以确保它位于主线程上)

以下是importerDidSave代码的相关位(此技术来源于此):

哪些产出:

... on Main Thread.  
Number of NSFetchedResultsController rows BEFORE: 1  
Number of NSFetchedResultsController rows AFTER: 3

那个代码是正确的。我会看看您将数据添加到存储的方式。

不要依赖直接SQL调试。核心数据对SQL的使用被隐藏在对象背后(它甚至不总是使用SQL),以至于您无法通过查看SQL来判断对象图的状态

最可能的情况是,该部分中有两个对象,但一个在内存中,另一个在持久存储中。在SQL调试中,只有持久化对象是明显的。在图形中可以有数千个对象,在表部分中可以有数千行,但在对象被持久化之前,它们不会显示在SQL中。此外,SQL插入和删除模式不会直接反映对象图的插入和删除

简而言之,SQL调试对于调试核心数据是非常无用的,在绝大多数情况下,您应该忽略它

如果获取的结果控制器在节中报告两个对象,则节中有两个对象。没有更多的信息,我不能说额外的物体是从哪里来的

检查:

  • 您的分区键(如果有)。如果您的分区被错误配置,您将在不期望它们出现的位置出现行
  • 检查插入以查看是否重复插入
    您可以通过手动执行FRC自己使用的相同获取并查看返回的内容来确认FRC是否正确。对每个分区键上的返回进行排序,您可以看到分区中显示了多少对象

    是的,代码是正确的。但是,问题不是将数据添加到存储中。查看SQLite数据库,我可以看到只有一行(这与提到1个INSERT的SQL调试一致)。出于某种原因,NSFetchedResultsController返回的行数不正确(但仅在上述特殊情况下)。我认为您认为您只是导入了一个对象而不是两个?是的,仅导入了一个对象。后台线程上只创建了一个对象,我使用NSLog语句和(fwiw)SQL调试模式验证了只导入了一个对象。
    - (void)importerDidSave:(NSNotification *)saveNotification {  
       NSLog(@"In importerDidSave...");  
       if ([NSThread isMainThread]) {  
         NSLog(@"... on Main Thread.");     
         NSLog(@"Number of NSFetchedResultsController rows BEFORE: %d", [[[fetchedResultsController sections] objectAtIndex:0] numberOfObjects]);  
         [self.managedObjectContext mergeChangesFromContextDidSaveNotification:saveNotification];  
         NSLog(@"Number of NSFetchedResultsController rows AFTER: %d", [[[fetchedResultsController sections] objectAtIndex:0] numberOfObjects]);  
    
    ... on Main Thread.  
    Number of NSFetchedResultsController rows BEFORE: 1  
    Number of NSFetchedResultsController rows AFTER: 3