NSFetchResultsController + sectionNameKeyPath + порядок разделов - PullRequest
0 голосов
/ 11 августа 2010

У меня есть отношения сущностей один ко многим между двумя сущностями:

EntityP (Parent) <-->> EntityC (Child)

Атрибуты и отношения:

EntityP.title
EntityP.dateTimeStamp
EntityP.PtoC (relationship)

EntityC.title
EntityC.dateTimeStamp
EntityC.CtoP (relationship) // Can be used to get "one" EntityP record

Я использую контроллер результатов выборки, чтобы показать результаты. Вот моя реализация контроллера результатов выборки:

#pragma mark -
#pragma mark Fetched results controller

- (NSFetchedResultsController *)fetchedResultsController {
     // Set up the fetched results controller if needed
     if (fetchedResultsController != nil) {
          return fetchedResultsController;
     }

     // Create the fetch request for the entity
     NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

     // Set Entity
     NSEntityDescription *entity = [NSEntityDescription entityForName:@"EntityC" inManagedObjectContext:self.managedObjectContext];
     [fetchRequest setEntity:entity];

     // Set Predicate
     // (Ignore, we want to get list of all EntityC records)

     // Set Sort Descriptors (sort on Parent - for section, and then on Child - for rows)
     NSSortDescriptor *sortDescriptorPDate = [[NSSortDescriptor alloc] initWithKey:@"CtoP.dateTimeStamp" ascending:YES];
     NSSortDescriptor *sortDescriptorDate = [[NSSortDescriptor alloc] initWithKey:@"dateTimeStamp" ascending:YES];
     NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptorPDate, sortDescriptorDate, nil];

     [fetchRequest setSortDescriptors:sortDescriptors];
     [fetchRequest setFetchBatchSize:20];

     // Create and initialize the fetch results controller
     NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"CtoP.title" cacheName:nil];
     aFetchedResultsController.delegate = self;
     self.fetchedResultsController = aFetchedResultsController;

     // Cleanup memory
     [aFetchedResultsController release];
     [fetchRequest release];
     [sortDescriptorPDate release];
     [sortDescriptorDate release];
     [sortDescriptors release];

     NSError *error = nil;
     if (![fetchedResultsController performFetch:&error]) {
          /*
           Replace this implementation with code to handle the error appropriately.

           abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button.
           */
          NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
          abort();
     }

     return fetchedResultsController;
}     

Теперь, например, если у меня есть следующие данные в постоянном хранилище:

EntityP.dateTimeStamp  EntityP.title    EntityC.dateTimeStamp   EntityC.title
Today                  B                Today                   d
Yesterday              A                Yesterday               a
Today                  B                Yesterday               c
Yesterday              A                Today                   b

Примечание. Вчера и сегодня в формате NSDate.

Тогда я должен получить разделы и строки в следующем порядке (точно):

A
 a
 b

B
 c
 d

Но сортировка не работает таким образом. Я получаю строки в правильном порядке, но разделы не упорядочены! Я надеюсь, что sortDescriptorPDate делает свою работу. Что мне не хватает? Благодарю в ожидании.

Ответы [ 2 ]

0 голосов
/ 24 ноября 2011

Это, кажется, работает сейчас!Я не уверен, что изменилось!- Мустафа 6 сентября 2010 года в 4:03

0 голосов
/ 11 августа 2010

Не уверен, что понимаю ваши настройки, но ...

По умолчанию заголовки разделов начинаются с заглавной первой буквы названия раздела. Если вам нужны пользовательские разделы, например, основанные на датах, вам потребуется создать подкласс NSFetchedResultsController и переопределить различные методы sectionIndex..., чтобы получить правильные разделы, индексы разделов и заголовки разделов.

...