核心数据fetchedresultscontroller问题:什么是"部分"?

Jak*_*ake 5 iphone cocoa-touch core-data objective-c

我正在努力了解Core Data(我在iPhone开发中是一个菜鸟)并且为了做到这一点,我试图从fetchedresultscontroller获取一个对象,并且它的名称是NSlog(对象的一个​​属性).我试着这样做:

NSArray *ar = [NSArray arrayWithArray:[fetchedResultsController sections]];
Task *t = [ar objectAtIndex:0];
NSLog(@"%@", t.taskName);
Run Code Online (Sandbox Code Playgroud)

但是,应用程序因此错误而崩溃:应用程序因错误而崩溃

因未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'*** - [_ NSDefaultSectionInfo taskName]:无法识别的选择器发送到实例0x3d1f670'

我已经知道你需要使用fetched objects属性,但是那些部分是什么?感谢您的帮助,对不起,如果这是一个极其愚蠢的问题.我查看了文档,但仍然不明白.

Ale*_*lex 27

NSFetchedResultsController可以根据您指定的键将对象分组.因此,例如,如果您的实体具有category属性,则可以按category对该对象进行分组,并将其显示在该类别的标题下.

每个UITableView(和每个NSFetchedResultsController)至少包含一个部分,因此即使您不使用此功能,您仍然需要处理部分.如果检查文档,您将看到sections属性中的对象符合NSFetchedResultsSectionInfo协议,该协议具有objects包含该部分中对象的属性.

有两种方法可以从中获取实际对象NSFetchedResultsController:

id <NSFetchedResultsSectionInfo> sectionInfo = [fetchedResultsController.sections objectAtIndex:0];
Task *task = [sectionInfo.objects objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)

另一种更简单,更优选的方法是使用该objectAtIndexPath:方法.

Task *task = [fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
Run Code Online (Sandbox Code Playgroud)

这两个样本是等价的.UIKit 添加了一些方法来NSIndexPath更轻松地处理表视图和获取结果控制器.另外,请注意,UITableViewDataSourceUITableViewDelegate方法都为您提供了NSIndexPath对象,因此您通常可以只传递这些objectAtIndexPath:对象以获取该单元格的正确对象.

Apple还提供了一个关于在iPhone上使用Core Data 的体面教程.它会回答你的很多问题.不幸的是,它没有NSFetchedResultsController深入介绍.