2014-04-29 27 views
5

CoreData: error: (NSFetchedResultsController) The fetched object at index 72 has an out of order section name 'อั. Objects must be sorted by section name'Błąd danych podstawowych: "Obiekty muszą być posortowane według nazwy sekcji" w przypadku określonych języków, takich jak tajski

Używam następującego kodu do sortowania według pola tytułu książki i wyświetlania pierwszej dużej litery tytułu książki książki jako nazwy sekcji w a UITableViewController.

Kod działa doskonale we wszystkich językach z wyjątkiem tajlandzkiego. Czytam w Internecie, że istnieją specjalne znaki spoza Stanów Zjednoczonych powodujące takie problemy (np. Æ), ale nie znalazłem jeszcze żadnego rozwiązania.

Zobacz gschandler odpowiedź na The fetched object at index [i] has an out of order section name 'å

Kodeks FRC jest

NSFetchedResultsController *aFetchedResultsController = 
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
           managedObjectContext:managedObjectContext 
            sectionNameKeyPath:@"titleFirstLetter" 
              cacheName:nil]; 

Kodeks PierwszaLit jest:

- (NSString *)titleFirstLetter { 

    // support UTF-16: 
    NSString* val = [self.title substringWithRange:[self.title rangeOfComposedCharacterSequenceAtIndex:0]]; 

    return [val uppercaseString]; 
} 

Wszelkie sugestie?

+0

Mam dokładnie ten sam problem, każdy język oprócz tajlandzkich utworów. Czy znalazłeś jakieś obejście? Czy podejście Gschandlera jest najlepsze? – jannej

+0

Początkowo stosowałem podejście gschandlera, ponieważ uważałem, że język tajlandzki jest jedynym problematycznym językiem ... Jednak gdy odkryłem, że niektóre postacie w języku niemieckim również powodują ten problem, postanowiłem, że rozwiązanie tego problemu jest koniecznością. Moim rozwiązaniem było po prostu dodanie pola "titleFirstLetter" w bazie danych sqlite zamiast pobierania tego pola w środowisku wykonawczym. W ten sposób wszystkie prace sortowania są wykonywane przez bazę danych sqlite i nie pojawia się żaden konflikt. Z pewnością nie jest to najczystsze rozwiązanie pod względem projektu DB, ale to obejście działa idealnie. – Joshua

+0

Ah ... teraz pamiętam, miałem podobny problem w innej aplikacji z CoreData i tworzenie wartości w czasie wykonywania, który zakończył się z dodatkową pracą w terenie. Wydaje się być najbezpieczniejszym sposobem. Dziękuję Ci! :-) – jannej

Odpowiedz

4

Musisz dodać deskryptor sortowania, który sortuje się na tej samej właściwości co sekcjaNazwaKeyPath.

NSSortDescriptor *sort = [[NSSortDescriptor alloc]initWithKey:@"titleFirstLetter" ascending:NO]; 
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sort,nil]]; 
[fetchRequest setFetchBatchSize:20];