2009-09-01 129 views
6

我将一个NSFetchedResultsController放入我的代码,所以我得到了很好的自动切片我的表视图数据。如何正确配置NSFetchedResultsController

所以我正在运行一个测试,以确保一切工作正常。我在持久存储中有一个Book实体。我将首先执行获取旧方式,然后我会尝试使用NSFetchedResultsController。这两个代码块之间的区别仅仅是2行。

代码没有 NSFetchedResultsController:

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:kBookEntityName inManagedObjectContext:self.managedObjectContext]; 
[request setEntity:entity]; 

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:NO]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[request setSortDescriptors:sortDescriptors]; 
[sortDescriptor release]; 
[sortDescriptors release]; 

    //The following 2 lines will be replaced by the NSFetchedResultsController 
NSMutableArray *mutableFetchResults = [[[self.managedObjectContext executeFetchRequest:request error:nil] mutableCopy] autorelease]; 
Book *result = (Book*)[mutableFetchResults objectAtIndex:0]; 

NSString* title = [result valueForKey:@"title"]; 
NSString* priority = [result valueForKeyPath:@"priority.name"]; 


[request release]; 

现在我在替换为NSFetchedResultsController行:

NSFetchedResultsController* fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"title" cacheName:@"BookList"];                                                                           

Book *result = (Book*)[fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]; 

似乎很添油加醋。第一个代码块可以正确提取单个Book实体。但是,NSFetchedResultsController的代码不会。相反,它返回零。

我的问题是:我在这个例子中正确配置NSFetchedResultsController?

(注意,该NSFetchedResultsController的fetchedObjects属性也是零)

回答

13

我觉得你还是需要告诉NSFetchedResultsController实际执行读取:

NSError *error; 
BOOL success = [controller performFetch:&error]; 

(从例如在拍摄NSFetchedResultsController参考)

另一件似乎很奇怪的事情:你真的想用“title”作为sectionNameKeyPath吗?基本上不会为每本书创建一个单独的部分?

+0

“标题”组织只是一个测试,以启动和运行。我实际上想通过作者姓名的关键路径进行区分,但希望通过一个简单的示例来使用它。 – 2009-09-02 02:24:13

+0

这真的很让人伤心,我并没有真正执行抓取。我不知道为什么我假定在初始化时执行了获取。 谢谢 – 2009-09-02 23:12:28

+0

谢谢,那帮助我:) – mateusmaso 2011-06-19 22:44:03

7

需要初始化您NSFetchedResultsController只有一次,,具体如下代码假设

NSFetchedResultsController *fetchedResultsController; 
NSManagedObjectContext *managedObjectContext; 

在控制器的头声明,并managedObjectContext已经正确初始化。

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    NSError *error; 
    if (![[self fetchedResultsController] performFetch:&error]) { 
     // Handle error 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 

    } 

    NSLog(@"%d objects fetched", [[fetchedResultsController fetchedObjects] count]); 
} 

- (NSFetchedResultsController *)fetchedResultsController { 

    if (fetchedResultsController != nil) { 
     return fetchedResultsController; 

    } 

    /* 
    Set up the fetched results controller. 
    */ 



    // Create the fetch request for the entity. 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    // Edit the entity name as appropriate. 
    NSEntityDescription *entity = [NSEntityDescription entityForName:kBookEntityName inManagedObjectContext:self.managedObjectContext]; 
    [request setEntity:entity]; 

/* Optional settings 

    [request setResultType:NSManagedObjectResultType]; 
    [request setIncludesPropertyValues:YES]; 
    [request setIncludesPendingChanges:NO]; 
    [request setReturnsObjectsAsFaults:NO]; 
*/ 


    // Edit the sort key as appropriate. 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:NO]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[request setSortDescriptors:sortDescriptors]; 
[sortDescriptor release]; 
[sortDescriptors release];; 

    // Edit the section name key path and cache name if appropriate. 
    // nil for section name key path means "no sections". 
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:managedObjectContext sectionNameKeyPath:@"title" cacheName:@"BookList"]; 
    aFetchedResultsController.delegate = self; 
    self.fetchedResultsController = aFetchedResultsController; 

    [aFetchedResultsController release]; 
    [request release]; 


    return fetchedResultsController; 
}