代码之家  ›  专栏  ›  技术社区  ›  Snowcrash

NSFetchedResultsController-幻像行

  •  1
  • Snowcrash  · 技术社区  · 14 年前

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

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

    id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
    numberOfRows = [sectionInfo numberOfObjects];
    

    如果我添加了其他条目,这些条目的报告是正确的。 如果我删除了最初的两行,就可以了。

    如果有任何帮助,请使用:

      -com.apple.CoreData.SQLDebug 1
    

    我可以看到有1个插入和2个选择。

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

    ====

    不知道这段代码是否有帮助。。。

    2完成后,它会向AppDelegate发送一个通知

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

    - (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
    
    2 回复  |  直到 14 年前
        1
  •  0
  •   TechZen    14 年前

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

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

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

    支票:

    1. 您的分区键(如果有)。如果您的节配置错误,您将有行,您不期望他们。

    您可以通过手动执行它自己使用的相同获取并查看返回的内容来确认FRC是否正确。对每个节键的返回进行排序,您可以看到节中出现了多少个对象。

        2
  •  0
  •   Gordon Fontenot    14 年前

    那个代码是正确的。我会看看你是如何将数据添加到商店的。