2009-10-01 8 views
4

J'essaie d'exécuter une requête d'extraction sur un contexte d'objet géré avec un prédicat qui teste un mot de passe existant dans certaines sous-classes d'une classe abstraite.CoreData récupère une requête via un objet géré abstrait vers un objet géré concret

Par exemple ici est une partie du modèle d'objet

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 

Si je mets la demande d'extraction suivante

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]; 

L'exécution de la requête d'extraction renvoie une erreur comme

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

Il ne semble pas qu'il existe un moyen de procéder à une évaluation paresseuse du prédicat. D'autres choses que j'ai déjà essayées sont un prédicat ANY, en utilisant le mot-clé CAST, en essayant de remplacer 'AllMovies' dans le SUBQUERY avec un autre SUBQUERY pour renvoyer un groupe d'objets qui correspond à la valeur 'type'.

Il serait possible de faire plusieurs requêtes pour chaque type de qualification, mais c'est grossier, lent et lourd.

Ceci est sous OS X 10.6 avec un stockage persistant SQL. Faire un magasin en mémoire n'est pas une option puisque je travaille avec 1 million de 'Bibliothèques' (le projet n'a vraiment rien à voir avec les films mais je pensais que c'était un bon exemple).

Merci, Rob

Répondre

1

Cela ne va pas travailler parce que votre modèle de l'entité indique que les données de base que la relation AllMovies contient Movie objets. Par conséquent, Core Data s'attend à pouvoir envoyer uniquement les messages qu'un objet Movie comprend. Quand il fomente le Fetch, il tester le prédicat contre chaque objet Movie (désigné par l'entité d'extraction.)

Cependant, ni l'entité Movie ni l'entité RomanceMovie comprendre le message monster (parce qu'ils manquent l'attribut.) Le test de prédicat est rendu absurde. C'est pourquoi vous obtenez l'erreur.

Vous devez repenser votre conception. Utiliser l'héritage d'une entité n'est probablement pas la façon dont vous voulez aller avec cela.

+0

Une bonne solution avec Core Data 2017? – Goppinath