How can I index a NSFetchedResultsController so that I can implement an A-Z index on a tableview.
I see in the initializer I can do sectionNameKeyPath but this just places unique objects in their own section.
Here is what I have for my NSFetchedResultsController
- (NSFetchedResultsController *)fetchedResultsController
{
if (__fetchedResultsController != nil) {
return __fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Customer" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setFetchBatchSize:20];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"name" cacheName:@"Customer"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
return __fetchedResultsController;
}
implement
sectionIndexTitlesForTableView:like this:this will give you those indexes on the right side of the tableView.
If you want your sections to have names like A, B, C, D etc. you have to implement a method that returns the first letter for your object.
something like this:
This goes into the custom subClass of your coredata entity.
Then add a transient attribute named
firstLetterto your core data entity and replace the sectionNameKeyPath in the NSFetchedResultsController init withfirstLetter