31 votes

Données de base : Entité abstraite dans la requête Fetch

Supposons que j'ai un modèle Core Data avec un abstrait entité appelée "Animal". Ensuite, j'ai de nombreuses autres entités qui héritent de cette entité abstraite : "Lion", "Chien", "Chat", etc. (Je ne suis pas en train de développer un programme de zoo, mais cette analogie fonctionne bien pour le problème que je suis en train d'expliquer).

Ce que je veux savoir c'est : Puis-je récupérer "tous les animaux" en même temps en faisant ceci :

NSFetchRequest *searchRequest = [[NSFetchRequest alloc] init];
[searchRequest setEntity:[NSEntityDescription entityForName:@"Animal" inManagedObjectContext:aContext]];

NSArray *matchedObjects = [aContext executeFetchRequest:searchRequest error:nil];

Je crois savoir qu'il existe des méthodes sur NSEntityDescription pour déterminer si une entité hérite d'une autre. Mais existe-t-il un moyen rapide de récupérer toutes les entités qui sont d'un type particulier (abstrait) --- dans ce cas, "Animal" ?

Si l'approche ci-dessus n'est pas valable, quelle est la manière la plus efficace de procéder ? Merci !

32voto

octy Points 4735

Vous pouvez définitivement utiliser cette approche.

De la part d'Apple Guide de programmation des données de base :

L'héritage d'entités fonctionne de manière similaire à l'héritage de classes, et est utile pour les mêmes raisons. Si vous avez un certain nombre d'entités qui sont similaires, vous pouvez factoriser les propriétés communes dans une superentité, également connue sous le nom d'entité mère. Plutôt que de spécifier les mêmes propriétés dans plusieurs entités, vous pouvez les définir dans une entité, et les sous-entités en héritent. Par exemple, vous pouvez définir une entité Personne avec les attributs firstName et lastName, et des sous-entités Employee et Customer, qui héritent de ces attributs.

2voto

sosborn Points 11273

J'ai fait quelque chose de similaire, mais cette entité n'était pas abstraite. C'était une entité standard (sans instances) et les autres entités que j'ai récupérées étaient toutes dérivées de cette entité. Je n'ai pas essayé avec une classe abstraite, mais en regardant la documentation, il semble que cela ne soit pas possible :

Guide de programmation des données de base

Entités abstraites Vous pouvez spécifier que une entité est abstraite, c'est-à-dire que vous ne créerez pas d'instances de cette entité. Vous rendez généralement une entité abstraite si vous avez un certain nombre d'entités qui représentent toutes des spécialisations de (hériter de) une entité commune qui ne doit pas elle-même être instanciée. Par exemple, dans une application de application de dessin, vous pouvez avoir une entité entité Graphique qui définit des attributs pour les coordonnées x et y, la couleur et les les limites du dessin. Cependant, vous ne devez jamais instanciez un graphique. Concrètement, concrètes de Graphic peuvent être Cercle, Zone de texte et Ligne.

Je vous suggère de mettre en place l'entité abstraite Animal et de tenter votre chance. Si cela ne fonctionne pas, il suffit de rendre l'entité Animal non abstraite (les mots me manquent, est-ce ainsi que nous l'appellerions ? Peut-être que "concret" serait plus approprié ?) et tout devrait bien se passer. Si quelqu'un a fait cela avec une classe abstraite, j'aimerais en savoir plus.

0voto

Kaom Te Points 248

Oui, je crois que vous pouvez aller chercher tous les animaux en même temps.

Extrait du guide de programmation des données de base :

Héritage des entités

Si vous spécifiez une entité parent dans Core Data comme l'entité pour une requête de récupération de Core Data, la récupération renvoie les instances correspondantes de de l'entité et de ses sous-entités (voir Récupération d'objets). En conséquence, si vous corollaire, si vous spécifiez une entité parent en tant qu'entité d'un contrôleur contrôleur qui est soutenu par Core Data, il récupère les instances correspondantes de l'entité et de toutes les sous-entités. de l'entité et de ses sous-entités. Si vous spécifiez une entité parent abstraite abstraite, le contrôleur soutenu par Core Data récupère les instances correspondantes des sous-entités concrètes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X