2009-10-01 1 views
4

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

Для примера здесь является частью объектной модели

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' 
             )[email protected] != 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, чтобы вернуть группу объектов, которая соответствует значению типа.

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

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

Спасибо, Роб

ответ

1

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

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

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

+0

Любое хорошее решение с Core Data 2017? – Goppinath

Смежные вопросы