2012-08-05 7 views
5

Sortuję wyniki żądania pobierania z deskryptorem sortowania.Jak sortować ciągi w języku innym niż angielski za pomocą nspredicate?

NSFetchRequest* req = [[NSFetchRequest alloc] initWithEntityName:[MyEntity entityName]]; 
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"property" 
                  ascending:YES 
                  selector:@selector(localizedCompare:)]; 
req.sortDescriptors = [NSArray arrayWithObject:descriptor]; 
return [self.managedObjectContext executeFetchRequest:req error:nil]; 

Problem polega na tym, że słowa, które zaczynają się od znaków nieangielskich takich jak "İ", są wymienione na końcu listy. Jest to łaźnia list i alfabetu wygląda następująco:

A, B, C, C, D, E, F, G, G, H, I, I, J, K, L, M, N, O, Ö, P, R, S, Ş, T, U, Ü, V, Y, Z.

Tak więc litera znajduje się na 12 pozycji.

Nie wiem dlaczego, ale korzystanie z komparatora po pobraniu obiektów działa. Tak więc działa na dowolnej tablicy, ale nie z deskryptorem sortowania dla żądania pobierania.

Odpowiedz

3

Spójrz na szczegółach moje pytanie w NSFetchedResultsController v.s. UILocalizedIndexedCollation pokażę jak używać UILocalizedIndexedCollation poprawnie generować alfabetu i sortowanie za pomocą odpowiedniej metody sortowania w oparciu o UILocalizedIndexCollation. Moje pytanie kręci się wokół pytania o lepszy sposób na zrobienie tego.

Jeśli nie użyjesz UILocalizedIndexCollation, powinieneś używać tylko localizedStandardCompare: not localizedCompare, jak wspomniano w filmach WWDC dla lokalizacji.

1

Spróbuj

[NSSortDescriptor alloc] initWithKey:@"property" ascending:YES selector:@selector(localizedCompare:)] 

EDIT

@Mert uaktualnił swoje pytanie. Wydaje się, że teraz localizedCompare: poprawnie sortuje tureckie litery, ale nie działa z żądaniem pobierania.

Oto, co zrobiłem, aby przetestować ten problem. Być może można sprawdzić, czy działa w środowisku, a następnie pracować stamtąd:

// Create some entities: 
NSArray *a = @[@"İ", @"J", @"Ğ", @"G", @"H", @"I", @"Ç", @"C"]; 
for (NSString *s in a) { 
    MyEntity *e = [NSEntityDescription insertNewObjectForEntityForName:@"MyEntity" 
               inManagedObjectContext:self.managedObjectContext]; 
    e.name = s; 
} 

// Fetch all entities in sorted order: 
NSFetchRequest* req = [[NSFetchRequest alloc] initWithEntityName:@"MyEntity"]; 
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"name" 
                  ascending:YES 
                  selector:@selector(localizedCompare:)]; 
req.sortDescriptors = [NSArray arrayWithObject:descriptor]; 
NSArray *result = [self.managedObjectContext executeFetchRequest:req error:nil]; 

„MyEntity” to jednostka bazowa Dane z jednym atrybucie „nazwa” typu String.

+0

It nie działa. Próbowałem też zmienić język symulatora. – Mert

+0

To dziwne. Jeśli sortuję tablicę z '[myArray sortedArrayUsingSelector: @selector (localizedCompare :)], wtedy otrzymam poprawne wyniki. Czy możesz pokazać kod, w jaki sposób konfigurujesz żądanie pobierania? –

+0

Zmodyfikowalem moje pytanie i dodalem kod: – Mert

0

miałem podobne problemy z:

[strArr sortedArrayUsingSelector:@selector(localizedCompare:)]

Wydaje się, że

localizedCompare

rozmowy

compare:other options:nil range:NSMakeRange(0, self.length) locale: [NSLocale currentLocale]];

[NSLocale currentLocale] może być w stanie mieszanym, w zależności od preferencji użytkownika.To jest dla nich potrzebne do stworzenia czystej NSLocale oparciu o język użytkowników

spróbuj utworzyć kategorię na NSString o następującej treści:

-(NSComparisonResult)currentLocalCompare:(id)other 
{ 
    NSLocale * currLoc = [NSLocale currentLocale]; //get current locale 
    NSLocale * loc = [[NSLocale alloc] initWithLocaleIdentifier:currLoc.localeIdentifier];//lets create a new clean NSLocale based on users prefared langauge 
    return [self compare:other options:nil range:NSMakeRange(0, self.length) locale:loc];//compare using clean NSLocale 
} 

i nazywają to lubią:

[strArr sortedArrayUsingSelector:@selector(currentLocalCompare:)]

Powiązane problemy