Core Data : Managed Object Context et héritage
nark
Membre
Hello all, encore moi...
Je reviens à la charge sur Core Data.
J'ai un modèle d'arbre avec une classe abstraite qui fait office de classe-mère et plusieurs sous-classes, le tout me permettant la gestion d'élément de types différents dans ma structure:
TreeNode : NSManagedObject
|
ClassNode : TreeNode
|
RelationNode : TreeNode
|
AttributeNode : TreeNode
|
:
.
Un NSTreeController gère le tout, et je suis plutôt satisfait du résultat.
Maintenant, je cherche à récupérer dans un NSArrayController une collection d'objet gérée par NSTreeController.
J'ai connecté mon NSArrayController comme suit:
- Entity Name : TreeNode
- Model Key Path : managedObjectContext
Et j'obtiens bel et bien une collection de TreeNode. Super!
Alors je me suis dit que si je mettais RelationNode comme entité, je ne récupèrerais que les objets de type correspondant. Mais non.
Je voudrais donc pouvoir filtrer le type d'objet managé par mon Array Controller pour obtenir une liste d'instances de RelationNode par exemple.
Est-ce possible?
PS: J'utilise NSPersistentDocument
Je reviens à la charge sur Core Data.
J'ai un modèle d'arbre avec une classe abstraite qui fait office de classe-mère et plusieurs sous-classes, le tout me permettant la gestion d'élément de types différents dans ma structure:
TreeNode : NSManagedObject
|
ClassNode : TreeNode
|
RelationNode : TreeNode
|
AttributeNode : TreeNode
|
:
.
Un NSTreeController gère le tout, et je suis plutôt satisfait du résultat.
Maintenant, je cherche à récupérer dans un NSArrayController une collection d'objet gérée par NSTreeController.
J'ai connecté mon NSArrayController comme suit:
- Entity Name : TreeNode
- Model Key Path : managedObjectContext
Et j'obtiens bel et bien une collection de TreeNode. Super!
Alors je me suis dit que si je mettais RelationNode comme entité, je ne récupèrerais que les objets de type correspondant. Mais non.
Je voudrais donc pouvoir filtrer le type d'objet managé par mon Array Controller pour obtenir une liste d'instances de RelationNode par exemple.
Est-ce possible?
PS: J'utilise NSPersistentDocument
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Je vais regarder, implémenter, tester, et je reviendrai surement. :P
J'utilise moi même ce système d'ancêtre commun pour gérer par exemple des UUID centralisé. Et pour autant je peut tout à fait mettre un de ses enfants dans l'entity recherché par NSArrayController.
Est-ce que tu peut nous faire un proto de ton problème histoire de voir ?
Moi aussi,
ça devrait marcher ainsi ...
... même si, à mon sens, il peut aussi être intéressant de laisser l'entité mère comme "entité officielle" du ArrayControleur et, ponctuellement à la demande, juste utiliser un FilterPredicate au grès des classes filles que l'on veut.
Heureux de te voir de passage parmi nous Hervé
Pourfendeur des grincheux, de l'inexactitude et des posts trop courts !
Tiens, il doit me rester une Cantillon, on va se l'ouvrir !
A la tienne
J'espère que tu nous reviens pas que pour quelques jours hein ! Allé !
Très content de te revoir en tout cas. A la tienne !
ps : désolé de pourrir le post, mais là c'est pour la bonne cause !
Tu sais, je sais jamais quand la "vraie vie" m'imposera un balck out ! :-\\
J'ai perdu un certain nombre d'amis comme ça déjà
Mais bon, j'suis là :brule:
Mais t'as raison, pourrissons pas le sujet de Nark
J'ai inscrit dans mon modèle Core Data deux entity, une (VLContact) hérite de NSManagedObject et contient juste un attribut name et eMail, deux NSString.
Et j'ai une autre Entity, VLUser, qui elle hérite de VLContact, c'est bien inscrit dans le model. VLUser ajoute juste l'attribut password, toujours un NSString.
Donc vu la hiérarchie je peut écrire:
Pas de souci, Xcode est d'accord. Mais quand je lance le bousin, j'ai une belle exception comme quoi l'instance de VLContact ne répond pas à setName:
J'ai surement oublié quelques choses mais je ne vois pas quoi? Je vous joint mon model.
Bon ça me marque que VLContact n'est pas KVC compliant mais pourtant je pensais que le .xcmodeldata le faisait directement?
Je vois pas bien ce que je dois ajouter, des méthodes setValue:forKey: pour chaques attributes?
C'est embêtant en plus tout les tuto ou info que je trouve ne traite jamais de l'héritage...
fait un clean all + build & analyse voir si t'as pas des messages d'erreur intéressant. Je vois pas trop là comme ça
C'est normal que VLContact réponde pas à setName.
Il n'a pas de property name.
Par contre setLastName ou setFirstName devraient fonctionner sans problème
Tout comme le setValue:forKey: non ?
Ceci dit le [tt]setValue: forKer:[/tt] reste intéressant pour une entité pour laquelle on a pas déclaré une autre classe que NSManagedObject.
ça évite en effet d'entendre la complainte du compilo au fond des bois.
Au runTime les accesseurs auront été générés par CoreData et ça marchera.
Mais du coup il n'y aura aucun contrôle du compilo.
Et la recommandation de la doc est plutôt de définir une catégorie de NSManagedObject dans laquelle on déclare les Properties du managedObject.
Mais, dès lors qu'on défini et implémente une classe pour une entitée, il faut bien sur déclarer les Properties (ou déclarer et implémenter les accesseurs).
Donc j'écris:
et on me répond:
J'ai fait un clean complet et rien n'y fait! Tu dit que ça devrais marcher yoann, tu as déjà été dans le même cas?
Par exemple:
Il ne suffit pas que dans ton modèle VLUser déclare VLContact comme classe parente.
Il faut aussi, bien sûr, que dans le header de VLUser tu le déclares comme sous classe de VLContact.
J'ai juste pas importe Core Data à cet endroit, mais il l'est dans VLContact.h, ça suffit bien?
Non ça suffit pas pour un header, faut aussi y importer explicitement coredata.
[EDIT] en fait pas si sûr mais pas le temps de vérifier, de toutes façons ça vaut le coup d'essayer, d'autant que je trouve l'usage de [tt]@class[/tt] plus propre que de compter sur des imports imbriqués qu'on fini par plus maitriser ...
Et par contre si c'est pas indispensable (bien rare), mieux vaux simplement déclarer, avec [tt]@class [/tt], une classe qui est référencée dans le header d'une autre que d'importer son header ...
ps: Par contre quand je met
au lieu de
Il est pas content, surement pcq pour l'heritage il a besoin de tout le header?
Oui t'as raison
Euh, pourquoi déclares-tu la variable password si elle figure bien dans le modèle ? @property suffit non ?
T'as bien, dans le modèle, sélectionné la bonne classe parente dans le popUpMenu "Parent" de l'entité fille ? ::)
Et bien merci pour tout, et pardons du dérangement, je range tout en partant...