NSFetchedResultsController(Core Data)不提供正确的数据源表视图控制器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NSFetchedResultsController(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”来从数据库创建新的获取请求,但是如果使用此方法,那么具有专为Table View设计的NSFetchedResultsController的重点是什么。
- “insertRowsAtIndexPaths(indexPaths:[NSIndexPath],withRowAnimation animation:UITableViewRowAnimation)”是否需要任何支持代码以确保使用更正的indexPath更新表视图?
摘要:
我想知道如何克服打印错误,以便我可以在表视图中添加一个新行,其中Core Data数据库从managedObjectContext中提供适量的对象。
解:
实现NSFetchedResultsControllerDelegate,让它完全控制表视图的CRUD流,而不是调用常规表视图行插入,删除NSFetchedResultsControllerDelegate'方法之外的方法,因为Core Data的NSFetchedResultsController充当数据源。
非常感谢
问候,
张靖元(Jingyuan Knight Zhang)
解:
实现NSFetchedResultsControllerDelegate,让它完全控制表视图的CRUD流,而不是调用常规表视图行插入,删除NSFetchedResultsControllerDelegate'方法之外的方法,因为Core Data的NSFetchedResultsController充当数据源。
以上是关于NSFetchedResultsController(Core Data)不提供正确的数据源表视图控制器的主要内容,如果未能解决你的问题,请参考以下文章