2010-05-11 114 views
5

我试图去了解核心数据(我是iPhone开发的noob),为了做到这一点,我试图从fetchedresultscontroller和NSlog中获取一个对象的名称(对象的属性) 。我试图做这样的:核心数据fetchedresultscontroller问题:什么是“部分”?

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

然而,应用程序崩溃与此错误:应用程序崩溃与错误

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[_NSDefaultSectionInfo taskName]: unrecognized selector sent to instance 0x3d1f670'

因为我已经学会了,你需要使用获取对象的属性为此,但那些部分是为了什么?感谢您的帮助,如果这是一个非常愚蠢的问题,很抱歉。我查看了文档,但仍然不明白。

回答

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

+1

哇,非常感谢你,这是很棒的信息。 – Jake 2010-05-14 16:57:28