Запрос извлечения CoreData через абстрактный управляемый объект к конкретному управляемому объекту - PullRequest
4 голосов
/ 01 октября 2009

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

Например, вот часть модели объекта

Library::NSManagedObject
 - AllMovies::to-many relationship->Movie

Movie::NSManagedObject (abstract)
 - type::String
 - name::String
 - mylibrary::to-one relationship->Library

HorrorMovie::Movie
 - monster::String
 - ghosts::BOOL

RomanceMovie::Movie
 - percociouskid::String
 - hasferret::BOOL

Если я настроил следующий запрос на выборку

NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Library" 
                                                     inManagedObjectContext:moc];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:entityDescription];
NSPredicate *predicate = [NSPredicate predicateWithFormat:
                            @"(SUBQUERY(AllMovies, $movies, 
                                                   $movies.type like[c] 'horror' and
                                                   $movies.moster like[c] 'yeti'
                                       ).@count != 0)"
                          ] 
[request setPredicate:predicate];

NSArray *array = [moc executeFetchRequest:request error:&error];

Выполнение запроса на выборку возвращает ошибку типа

keypath $movies.monster not found in entity <NSSQLEntity Movie id=2>

Не похоже, что есть способ ленивой оценки предиката. Некоторые другие вещи, которые я уже пробовал, это ЛЮБОЙ предикат, использующий ключевое слово CAST, пытающийся заменить 'AllMovies' в SUBQUERY другим SUBQUERY, чтобы вернуть группу объектов, которая соответствует значению 'type'.

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

Это в OS X 10.6 с постоянным хранилищем SQL. Создание хранилища в памяти не вариант, так как я работаю с более чем 1 миллионом «библиотек» (проект на самом деле не имеет ничего общего с фильмами, но я подумал, что это хороший пример).

Спасибо, Rob

1 Ответ

1 голос
/ 25 февраля 2011

Это не сработает, потому что ваша модель сущности просто сообщает Core Data, что отношение AllMovies содержит Movie объектов. Поэтому Core Data ожидает, что сможет отправлять только те сообщения, которые понимает объект Movie. Когда он инициирует выборку, он проверяет предикат для каждого отдельного Movie объекта (как обозначено объектом выборки).

Однако ни сущность Movie, ни сущность RomanceMovie не понимают сообщение monster (потому что им не хватает атрибута.) Тест предикатов представляется бессмысленным. Вот почему вы получаете ошибку.

Вы должны переосмыслить свой дизайн. Использование наследования объектов, вероятно, не так, как вы хотите с этим.

...