Сортировка по отношению ко многим, используя NSFetchedResultsController - PullRequest
2 голосов
/ 05 октября 2010

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

* Завершение приложения из-за необработанного исключения NSInvalidArgumentException, причина: 'ключ ко многим здесь не разрешен'

Моя модель данных настроена следующим образом:

Item << ---> Категория <--- >> SortOrder << ---> Магазин

Другими словами: каждый предмет относится к одной категории. Категории могут иметь разные порядки сортировки для каждого магазина, который включает определенную категорию.

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

Когда я выполняю выборку (последняя строка ниже), я получаю вышеуказанную ошибку.

 NSManagedObjectContext* context = [appDelegate managedObjectContext];
 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(status != %d) AND (ANY category.sort.include == YES) AND (ANY category.sort.store == %@)", ItemStatusDefault, store];

 NSEntityDescription *entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:context];
 [fetchRequest setEntity:entity];
 [fetchRequest setPredicate:predicate];

 NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"category.sort.order" ascending:YES];
 NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
 [fetchRequest setSortDescriptors:sortDescriptors];
 [sortDescriptors release];
 [sortDescriptor release];

 self.resultsController = [[NSFetchedResultsController alloc]
             initWithFetchRequest:fetchRequest
             managedObjectContext:context
             sectionNameKeyPath:@"category.name"
             cacheName:nil];
 [fetchRequest release];

 NSError *error;
 BOOL success = [self.resultsController performFetch:&error]; 

Если я изменю сортировку, скажем, на названия категорий, это сработает.

 NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"category.name" ascending:YES];

Как я могу получить NSSortDescriptor для сортировки в порядке сортировки?

UPDATE: Так что, похоже, это невозможно. Я получил предложение создать временное свойство и отсортировать по нему, но Документация Apple четко гласит

Вы не можете получить с помощью предиката на основе переходных свойств

Мой вывод заключается в том, что я не могу использовать NSFetchedResultsController из коробки. Мне нужно либо получить доступ к массиву объектов, которые NSFetchResultsController дает мне и отсортировать в памяти, либо настроить свои собственные запросы на выборку и пропустить NSFetchedResultsController.

1 Ответ

0 голосов
/ 19 января 2012

iOS 5 обеспечивает теперь упорядоченные отношения

https://developer.apple.com/LIBRARY/ios/releasenotes/DataManagement/RN-CoreData/index.html

UPDATE: Ссылка обновлена ​​

Ссылка: «Примечания к выпуску Core Data для OS X v10.7 и iOS 5.0»

...