Я пытаюсь выполнить запрос на выборку для контекста управляемого объекта с помощью предиката, который проверяет путь к ключу, который существует в некоторых подклассах абстрактного класса.
Например, вот часть модели объекта
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