Я пытаюсь использовать 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.