1

这可能是一个简单的问题,但它让我难住了。

背景:我有一个非常简单的 UITableView,它链接到 FetchedResultsController。基本上,该表为 FetchedResultsController 中的每一行填充一行。

问题陈述:如果我点击我的应用程序上的一个按钮来查看所有记录,应用程序会因错误而崩溃

NSRangeException',原因:' * -[_PFBatchFaultingArray objectAtIndex:]: 索引 (2) 越界 (2)

但是,如果我单击另一个显示添加数据的屏幕的按钮,请取消此屏幕而不保存任何内容,然后返回查看所有屏幕,该屏幕可以正常工作。

我什至尝试使用 NSLog 语句进行调试,您可以在下面看到

2012-06-01 23:37:01.345 TC[35258:fb03] sections : 1
2012-06-01 23:37:43.154 TC[35258:fb03] rows 3
2012-06-01 23:39:29.174 TC[35258:fb03] indexpath <NSIndexPath 0x91180f0> 2 indexes [0, 0]
2012-06-01 23:41:29.041 TC[35258:fb03] indexpath <NSIndexPath 0x903e770> 2 indexes [0, 1]
2012-06-01 23:41:44.015 TC[35258:fb03] indexpath <NSIndexPath 0x904afb0> 2 indexes [0, 2]
2012-06-01 23:41:46.598 TC[35258:fb03] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[_PFBatchFaultingArray objectAtIndex:]: index (2) beyond bounds (2)'

这让我很困惑 - 当明显有 3 行时,为什么它会在第三行抛出错误?非常感谢您的帮助和洞察力。谢谢你

4

1 回答 1

0

找到问题和解决方案。这是发生的事情

  1. 在我的应用程序的主菜单中,我有两个按钮 - 一个用于向数据库添加新项目,另一个用于查看数据库中的所有项目
  2. 如果我直接从主菜单查看所有项目而不尝试先添加内容,则会发生上述错误。
  3. 我意识到,如果我进入添加屏幕并取消添加屏幕,我仍在 ManagedObjectContext 中创建一个对象,但在我取消时并没有删除它。因此,系统仍然计算了 3 行 MamagedObjects,但实际上在数据库中只找到了 2 个已提交的。
  4. 我添加了一行取消按钮代码以从上下文中删除当前托管对象,从 iOS 模拟器中删除应用程序,重新编译并运行它 - 就像一个魅力。

您可能有同样的问题 - 请尝试以下步骤以确定您的问题是否相似

  1. 从模拟器中删除应用程序,重新编译并运行它。如果它工作正常,那么上下文和数据库之间肯定存在冲突
  2. 检查以确保您正在删除您可能已创建但未提交的托管对象。
于 2012-06-05T03:22:17.130 回答