NSFetchedResultsController разделы локализованы отсортированы - PullRequest
7 голосов
/ 30 апреля 2010

Как я могу использовать NSFetchedResultsController с переведенным ключом сортировки и sectionKeyPath?

Проблема: у меня есть идентификатор в свойстве «тип» в базе данных типа typeA, typeB, typeC, ... а не значение напрямую, потому что оно должно быть локализовано. На английском языке typeA = Bird, typeB = Cat, typeC = Dog на немецком языке это будут Vogel, Katze, Hund.

С NSFetchedResultController с ключом сортировки и sectionKeyPath на «тип» я получаю заказ и разделы - наберите "А - тип B - тип С

Далее я перевожу для отображения и все отлично на английском: - птица - Кошка - собака

Теперь я переключаюсь на немецкий и получаю неправильный порядок сортировки. - Фогель Катце - Hund

потому что он все еще сортирует по типу A, typeB, typeC

Так что я ищу способ локализовать сортировку для NSFetchedResultsController.

Я попробовал подход временного свойства, но это не работает для ключа сортировки, потому что ключ сортировки должен быть в сущности.

У меня нет другой идеи. Но я не могу поверить, что невозможно использовать NSFetchedResultsController для производного атрибута, необходимого для локализации?

Есть связанные обсуждения, такие как Использование пользовательских разделов с NSFetchedResultsController? Но разница в том, что имена пользовательских разделов и ключ сортировки, вероятно, имеют одинаковый порядок. Не в моем случае и это главное отличие.

В конце мне понадобится порядок сортировки необходимого NSSortDescriptor для производного атрибута. Этот порядок сортировки должен также служить для sectionKeyPath.

Спасибо за любую подсказку.

Ответы [ 3 ]

3 голосов
/ 05 мая 2010

ОК, не очень хорошее решение, но в конце оно работает (потому что у меня есть определенный ограниченный набор записей около 100):

При инициализации приложения:

  • Я создаю атрибут "order by" в управляемом объекте.
    • Я проверяю, изменилась ли локализация (и вместе с ней порядок сортировки) с прошлого раза. Если так:
    • Я получаю все записи и сортирую их в NSArray по локализованным именам.
    • Я записываю записи в магазине

По причинам производительности я выбираю и сортирую записи только в соответствии с NSPredicate.

Чем я могу использовать весь существующий код, используя «упорядочить по» в качестве ключа сортировки и пути ключа раздела.

Я знаю, что мог бы использовать свой упорядоченный массив в качестве источника данных для табличного представления, но я хотел сохранить существующий код и использовать методы NSFetchedResultsController.

Для удобства я имею полный контроль над сортировкой, которая будет соответствовать моим потребностям в будущем, поскольку я планирую построить более сложный порядок сортировки (на основе местоположения, более высокую вероятность использования записей сверху и т. Д.). )

Однако это не элегантное решение.

0 голосов
/ 30 апреля 2010

Полагаю, проблема в кеше.

Вы можете установить кэш с заданным именем при создании объекта NSFetchedResultsController, используя следующий метод. Последняя переменная - это имя кэша.

- (id)initWithFetchRequest:(NSFetchRequest *)fetchRequest managedObjectContext:(NSManagedObjectContext *)context sectionNameKeyPath:(NSString *)sectionNameKeyPath cacheName:(NSString *)name

NSFetchedResultsController использует кэш для вычисления разделов и упорядочения, если существует кэш с тем же именем. И кеш записывается на диск (не в память).

Так что если вы меняете язык с английского на немецкий, вам следует удалить кеш. Для удаления кэша вы можете использовать метод класса deleteCacheWithName:.

Подробную информацию вы можете найти здесь. http://developer.apple.com/iphone/library/documentation/CoreData/Reference/NSFetchedResultsController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40008227-CH1-SW24

0 голосов
/ 30 апреля 2010

В конце мне понадобится порядок сортировки необходимого NSSortDescriptor для производного атрибута, я думаю.

Для сортировки одной из возможностей будет сделать что-то вроде:

[NSSortDescriptor initWithKey:@"type" 
 ascending:YES 
 selector:@selector(translatedCompare:)]

где translatedCompare - это метод сравнения, который вы пишете (как категория на NSString), который локализует значения перед их сравнением.

Не уверен, как обработать sectionKeyPath.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...