How to properly configure NSFetchedResultsController

core-data, iphone

Solution

I think you still need to tell the `NSFetchedResultsController` to actually perform the fetch:

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

(taken from the example in the `NSFetchedResultsController` reference)

one other thing that seems odd: do you really want to use "title" as the `sectionNameKeyPath`? won't that basically create a separate section for each book?

Problem

I am placing an NSFetchedResultsController into my code so I get that nice automatic sectioning of my table view data. So I am running a test to make sure everything works properly. I have a single Book entity in my persistent store. I will first perform the fetch the old way, then I will try to use NSFetchedResultsController. The difference between the 2 blocks of code is just 2 lines. Code without 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]; ``` Now I substitute in the lines for the NSFetchedResultsController: ``` NSFetchedResultsController* fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"title" cacheName:@"BookList"]; Book *result = (Book*)[fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]; ``` Seems pretty cut and dry. The first code block properly fetches the single Book entity. The code with the NSFetchedResultsController, however, does not. Instead it returns nil. My question is: Am I properly configuring the NSFetchedResultsController in this example? (note, the fetchedObjects property of the NSFetchedResultsController is also nil)

Original source