iPhone Fetch Request с локализованной сортировкой - PullRequest
2 голосов
/ 06 февраля 2010

Я пытаюсь получить отсортированные локализованные данные из базовой модели данных. Мой код:

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];

Но когда я получаю объекты, они все равно сортируются с исходными значениями (нелокализованные данные).

Что я не правильно делаю?

1 Ответ

1 голос
/ 06 февраля 2010

Как вы получаете локализованный names от сущности CoreData? Дело не в том, что localizedCompare: волшебным образом извлекает локализованную версию строк и сравнивает их. Вместо этого он использует локализованные порядки сортировки для тех же строк. Сортированная версия массива, содержащего @"England", @"France", @"Germany", будет одинаковой в любой стране ... они не содержат символов с акцентом или чего-либо еще. Результат localizedCompare: может измениться только тогда, когда два языка используют различный порядок сортировки букв.

Если вы хотите извлечь что-то из Localizable.strings на основе свойства сущностей CoreData, вам нужно сделать это вручную. Бэкенд Sqlite CoreData не будет обрабатывать это на уровне запросов на выборку. Поэтому вам нужно сначала извлечь записи в NSArray, а затем отсортировать их, используя sortedArrayUsing...:, передав метод, который извлекает локализованные имена по NSLocalizedString и сравнивает их.

...