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

时间:2010-05-11 08:46:05

标签: iphone objective-c cocoa-touch core-data

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

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

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

  

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

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

1 个答案:

答案 0 :(得分:27)

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

每个UITableView(以及每个NSFetchedResultsController)至少包含一个部分,因此即使您没有使用此功能,您仍然需要处理部分。如果您check the documentation,您将看到sections属性中的对象符合NSFetchedResultsSectionInfo协议,该协议具有包含该部分中对象的objects属性。

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

id <NSFetchedResultsSectionInfo> sectionInfo = [fetchedResultsController.sections objectAtIndex:0];
Task *task = [sectionInfo.objects objectAtIndex:0];

另一种更简单,更首选的方法是使用objectAtIndexPath:方法。

Task *task = [fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];

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

Apple还在iPhone上使用Core Data提供decent tutorial。它会回答你的很多问题。不幸的是,它没有涵盖NSFetchedResultsController的深度。