NSFetchRequestController работает на iOS5, сбой на iOS4.3 - PullRequest
1 голос
/ 23 декабря 2011

Я пытался внедрить Core Data в проект, который требует минимум iOS 4.3. Я получаю код для работы без проблем на iOS 5, но при попытке его с iOS 4.3 он падает по следующей причине:

Unresolved error Error Domain=NSCocoaErrorDomain Code=134060 "The operation couldn’t be completed. (Cocoa error 134060.)" UserInfo=0x4fb59b0 {reason=The fetched object at index 4 has an out of order section name 'Å. Objects must be sorted by section name'}, {
reason = "The fetched object at index 4 has an out of order section name '\U00c5. Objects must be sorted by section name'";

Вот мой код:

- (NSFetchedResultsController *)fetchedResultsController
{
if (__fetchedResultsController != nil) {
    return __fetchedResultsController;
}

// Set up the fetched results controller.
// Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.

fetchRequest.entity = [NSEntityDescription entityForName:@"Exhibitor" 
                                  inManagedObjectContext:self.managedObjectContext];

// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" 
                                                               ascending:YES 
                                                                selector:@selector(caseInsensitiveCompare:)];

fetchRequest.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

// 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:fetchRequest
                                                         managedObjectContext:self.managedObjectContext 
                                                         sectionNameKeyPath:@"firstLetter" 
                                                         cacheName:nil];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;

NSError *error = nil;
if (![self.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. 
     */
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}

  return __fetchedResultsController;
}   

Если я в своем sortDesctriptor выбрал использование caseInsensitivecompare: вместо localizedCaseInsensitiveCompare: он не падает, но порядок неправильный (поскольку мне нужно, чтобы Å Ä Ö находилось внизу, а не после A и O).

Предложения

UPDATE: Похоже, когда я убиваю свое приложение в панели многозадачности, а затем снова запускаю его, порядок с ÅÄÖ правильный (с использованием caseInsensitiveCompare). Но только после первого перезапуска. Это все еще неправильно при первом запуске ...

1 Ответ

1 голос
/ 24 декабря 2011

Вы используете заголовки разделов? Кажется, к чему относится эта ошибка.

Просто добавьте:

-(NSString *)controller:(NSFetchedResultsController *)controller
             sectionIndexTitleForSectionName:(NSString *)sectionName {
   return sectionName;
}

к вашему контроллеру табличного представления.

...