Apple的iPhone SDK 3.0 CoreDataBooks示例是否已损坏?

时间:2009-10-01 19:20:59

标签: iphone cocoa-touch core-data

我在我的应用程序中遇到过这个问题,并使用Apple的CoreDataBooks代码库对代码进行了0次修改。问题是如果您对托管对象进行编辑并保存上下文,结果是一个只有一行现在没有行的部分,并且创建了一个新的部分,并添加了结果对象,那么您将得到无效的更新异常。它似乎也取决于行的顺序。

要重新创建,请按以下步骤操作:

  1. 打开CoreDataBooks示例的新实例
  2. 编辑理查德道金斯的书,“自私的基因”并将作者改为本。保存。如果您返回主视图,您会注意到该书位于名为Ben的新章节下。
  3. 再次编辑本书,并将作者更改为Doug。保存。您将获得以下异常:

    2009-10-01 15:14:29.050 CoreDataBooks[10898:20b] *** Assertion failure in -[UITableView_endCellAnimationsWithContext:], /SourceCache/UIKit/UIKit-963.10/UITableView.m:729 2009-10-01 15:14:29.051 CoreDataBooks[10898:20b] Serious application error.  Exception was caught during Core Data change processing: Invalid update: invalid number of rows in section 1.  The number of rows contained in an existing section after the update (2) must be equal to the number of rows contained in that section before the update (2), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted). with userInfo (null)
    
  4. 我会从我自己的应用程序发布代码,以确保我没有错过任何必需的委托方法,除非上面的示例显示它是直接影响Apple的CoreDataBooks示例的问题。 NSFetchedResultsController委托方法都是根据自己的示例实现的。他们的代码似乎也不会忘记处理新创建的部分,因为它适用于其他具有不同部分顺序的情况。

    任何帮助将不胜感激。来自CoreDataBooks示例的示例修改代码非常棒。

2 个答案:

答案 0 :(得分:2)

一个建议是您完全从iPhone中删除应用程序和/或重置模拟器,以确保您没有任何损坏的数据存储的残余。

删除应用程序或重置模拟器后,从头开始重新编译此应用程序。这将创建应用程序的新副本,更重要的是,创建一个新的数据存储。

在执行此操作后重新运行测试,以查看是否遇到了同样的问题。

答案 1 :(得分:2)

解决这个问题的方法似乎是在RootViewController的表更新部分更改这些行:

    case NSFetchedResultsChangeMove:
  [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

  // Reloading the section inserts a new row and ensures that titles are updated appropriately.
  [tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade];
   break;

为:

         case NSFetchedResultsChangeMove:
      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
      [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
      break;

出于某种原因。问题似乎来自删除部分中的最后一行;看起来,除非你添加额外的insertRows,否则UITableView会因为删除的部分突然获得一大堆额外的行而感到不安。

花了我几个小时才想出那个......