iPhone FETCH avec tri localisé
-
18-09-2019 - |
Question
Je suis en train d'obtenir des données localisées triées d'un modèle de données de base. Mon code:
NSEntityDescription *entityDescription = [NSEntityDescription entityForName: entityDescriptionValue
inManagedObjectContext: context];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity: entityDescription];
[fetchRequest setPredicate: predicate];
NSSortDescriptor *sortBy = [[NSSortDescriptor alloc] initWithKey: @"name" ascending: YES selector: @selector(localizedCompare:)];
[fetchRequest setSortDescriptors: [NSArray arrayWithObject: sortBy]];
[sortBy release];
Mais, quand je reçois les objets, ils viennent toujours avec les valeurs triées originales (données non localisées).
Qu'est-ce que je fais pas?
La solution
Comment obtenez-vous la names
localisée de l'entité CoreData? Ce n'est pas localizedCompare:
récupère par magie la version localisée de chaînes et de les comparer. Il utilise plutôt les ordres de tri localisés aux mêmes chaînes.
La version d'un tableau triée contenant @"England"
, @"France"
, @"Germany"
serait le même dans tous les pays ... ils ne contiennent pas de caractères accentués ou peu importe. Le résultat de localizedCompare:
ne peut changer lorsque deux langues utilisent différents ordres de tri entre les lettres.
Si vous voulez récupérer quelque chose de Localizable.strings
basée sur la propriété des entités CoreData, vous devez le faire manuellement. backend sqlite de CoreData ne traitera pas qu'au niveau des demandes de récupération. Donc, vous devez d'abord chercher les entrées dans un NSArray
, et doit ensuite les trier en utilisant sortedArrayUsing...:
en adoptant une méthode qui permet de retrouver les noms localisés par NSLocalizedString
et les compare.