8
votes

Comment pouvez-vous faire référence à un nom d'entité enfant dans un prédicat pour une demande de récupération de l'entité mère?

J'ai la nécessité de créer un prédicat complexe pour un objet de base abstrait. Je souhaite avoir des requêtes de prédicat séparées pour différentes entités héritantes et la clé de la sous-entité, l'exemple ci-dessous est ce que je voudrais faire, cependant, je n'ai pas été en mesure de trouver un moyen de faire référence au nom d'entité ou à ce type le prédicat.

NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"MyCommonObjectBase" inManagedObjectContext:myContext];

NSPredicate *subclassAPredicate = [NSPredicate predicateWithFormat:@"someValue > %@ && entityName = %@", 100, @"SubclassA"];
NSPredicate *subclassBPredicate = [NSPredicate predicateWithFormat:@"someValue < %@ && entityName = %@", 50, @"SubclassB"];

request.predicate = [NSCompoundPredicate orPredicateWithSubpredicates:[NSArray arrayWithObjects:subclassAPredicate, subclassBPredicate, nil]];


0 commentaires

3 Réponses :


3
votes

Un tir dans l'obscurité ici, mais qu'en est-il de l'utilisation de la valeur classname code> dans le prédicat?

NSManagedObjectContext * c = [self managedObjectContext];
NSFetchRequest * f = [[NSFetchRequest alloc] init];
[f setEntity:[NSEntityDescription entityForName:@"AbstractFolder" inManagedObjectContext:c]];
[f setPredicate:[NSPredicate predicateWithFormat:@"entity.name = %@", @"DefaultFolder"]];
NSError * e = nil;
NSArray * a = [c executeFetchRequest:f error:&e];
[f release];
NSLog(@"%@", a);


7 commentaires

Je vais donner cela un coup de feu, merci. Oui, c'est une faute de frappe de généraliser un code de production pour des raisons d'illustration.


Pas de chance, le nom de classe n'est pas un clavier valide. En outre, je cherche le nom de l'entité de soi non une entité enfant juste pour clarifier.


Je ne vois pas le même résultat, quand j'ajoute que je reçois toujours une erreur avec le message "Entity KeyPath.name non trouvé dans l'entité".


L'avez-vous fait cela dans une application iPhone ou Mac? Je me demande s'il y a une différence dans la mise en œuvre des données de base.


@Greg - je viens de l'essayer avec une application iPhone et j'ai trouvé quelque chose de curieux. Cela fonctionnera si votre type de magasin est NsbinaireReType, mais pas si c'est NSSQLITESTORETYPE. Mon code ci-dessus était en cours d'exécution sur un nsxmlstoretType. Je vais continuer à chercher un moyen de le faire sur un sqlitestoreType.


J'ai soumis un rapport de bogue à Apple à ce sujet, espérons-le, ils peuvent le réparer à un moment donné.


Entity.name n'a pas non plus fonctionné à iOS pour moi non plus. Clavier non trouvé pour l'entité.



-1
votes

Le seul moyen d'associer un prédicat avec une entité que je connaisse est-ce:

NSPredicate * predicate = [NSPredicate predicateWithFormat: @"(%K == %@)", fieldName, fieldValue, nil];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:[NSEntityDescription entityForName:entityName inManagedObjectContext:managedObjectContext]];
[request setPredicate:predicate];


0 commentaires

14
votes

J'ai une réponse d'Apple à http://bugreporrer.apple.com Numéro de problème 7318897:

Entity.name n'est pas une propriété modélisée, ce n'est donc pas légal. Cela fonctionne par accident sur le magasin binaire. La bonne façon d'aller chercher des sous -ités est de le faire sur le NSFetchRequest et d'utiliser soit une séchuSludessubentities, soit pas.

Il semble donc que la solution appropriée consiste à obtenir des demandes de récupération séparées et à fusionner les ensembles de résultats après l'exécution.


1 commentaires

Alors, ce que vous dites, c'est que mon problème n'a pas de solution plutôt que d'aller chercher le résultat, puis d'appliquer les prédicats de repos sur le résultat en main? Stackoverflow.com/Questtions/11934763/...