FetchedResultsController上的NSRangeException

时间:2012-06-02 04:53:25

标签: objective-c core-data

这可能是一个简单的问题需要解决,但它让我难过。

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

问题陈述: 如果我点击我的应用程序上的按钮查看所有记录,应用程序崩溃并显示错误

  

NSRangeException',原因:' * - [_ PFBatchFaultingArray objectAtIndex:]:index(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行时,为什么它会在第三行引发错误?非常感谢您的帮助和见解。谢谢

1 个答案:

答案 0 :(得分:0)

发现问题和解决方案。以下是发生的事情

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

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