NSFetchedResultsController(核心数据)不提供正确的数据源表视图控制器

时间:2016-08-11 13:21:29

标签: ios uitableview core-data

我最近遇到了一个挑战。我真的很感激任何人都可以提供任何支持。

问题:NSFetchedResultsController(Core Data)没有提供正确的数据源表视图控制器。

我想要实现的目标:

  • 我使用CloudKit作为存储大部分用户数据的主数据库。
  • 我使用Core Data在本地存储CKRecordID和recordChangeTag,以更新Table View和Collection View,并将这些存储值作为获取相关CloudKit数据的句柄。
  • 我创建了一个NSFetchedResultsController作为表视图控制器的实例变量,以获取数据结果作为表视图的数据源。

什么有效:

  • CloudKit数据库可以通过应用程序保存,修改和删除CKRecord。
  • 在不使用Core Data NSFetchedResultsController的情况下,只有CloudKit和Table View位于项目的最后一个版本中,该应用程序可以加载CloudKit数据,以通过CloudKit方便的API将表视图作为其数据源提供。数据修改和删除也有效。

我得到什么错误:

  • 现在我有CloudKit,Core Data和Table View Controller的实例变量NSFetchedResultsController,当我尝试将新对象添加到Core Data数据库并插入新的Table View行时,会打印以下错误:控制台和应用程序崩溃:

    • timicip_APITest_CloudKit_TableView_StoringRecordID [37142:1567814] *** 由于未捕获的异常而终止应用程序 'NSInternalInconsistencyException',原因:'无效更新:无效 第0节中的行数。包含在中的行数 更新后的现有部分(0)必须等于数量 更新前的该部分中包含的行(0),加号或减号 从该部分插入或删除的行数(插入1个, 删除0)加上或减去移入或移出的行数 该部分(0移入,0移出)。'*

我做了什么不起作用:

  • 每当我将新数据插入数据库时​​,我都会尝试通过调用managedObjectContext.save()来确保将新对象保存到Core Data托管持久存储中。但即使在我这样做之后,我们的表视图也试图从NSFetchedResultsController中获取数据,NSFetchedResultsController将不会在表视图数据源方法“tableView(tableView:UITableView,numberOfRowsInSection”中提供正确数量的其获取对象): Int) - > Int“。应用程序崩溃了。但是当我重新打开应用程序时,我在上次打开时输入的数据将显示在表视图中,而当我向表视图添加新对象时,它仍然会崩溃。

我认为解决方案的方向是什么:

  • 我不确定“managedObjectContext.save()”调用是否真的保存了数据,也不确定是否使用“NSFetchedResultsController.sections![section] .numberOfObjects”返回保存的对象。
  • 我是否需要通过对结果调用“executeFetchRequest:error:on NSManagedObjectContext”来从数据库创建新的获取请求,但是如果使用此方法,那么为表格视图专门设计的NSFetchedResultsController有什么意义呢?
  • “insertRowsAtIndexPaths(indexPaths:[NSIndexPath],withRowAnimation animation:UITableViewRowAnimation)”是否需要任何支持代码以确保使用更正的indexPath更新表视图?

要点:

我想知道如何克服打印错误,以便我可以在表视图中添加一个新行,其中Core Data数据库从managedObjectContext中提供适量的对象。

解决方案:

实现NSFetchedResultsControllerDelegate,让它完全控制表视图的CRUD流,而不是调用常规表视图行插入,删除NSFetchedResultsControllerDelegate'方法之外的方法,因为Core Data的NSFetchedResultsController充当数据源。

非常感谢

此致

张靖元(Jingyuan Knight Zhang)

1 个答案:

答案 0 :(得分:3)

解决方案:

实现NSFetchedResultsControllerDelegate,让它完全控制表视图的CRUD流,而不是调用常规表视图行插入,删除NSFetchedResultsControllerDelegate'之外的方法。方法,因为Core Data的NSFetchedResultsController充当数据源。