Core Data: Instanciation des entités liées
Céroce
Membre, Modérateur
Bonjour à tous,
J'ai beau lire et relire la doc d'Apple, moissonner les forums et autopsier les programmes d'exemple d'Apple (totalement inutiles, comme d'habitude), je n'arrive pas à trouver réponse à mes questions. >:(
Soit un simple modèle:
Nous allons dire que Shape, Rect et Color sont toutes des classes héritées de NSManagedObject, respectivement ShapeManagedObject, RectManagedObject et ColorManagedObject.
Les instances de ShapeManagedObject sont stockées dans un NSArrayController, instancié sous IB.
Lorsqu'un ShapeManagedObject est créé (target Add: de NSArrayController), sa méthode -awakeFromInsert est appelée. J'en profite pour lui lier ses deux relations, puisque la doc dit que je suis responsable de l'instanciation:
_rect et _color sont deux variables d'instance.
Remarquez les retain, puisque la doc précise que les entités sont autoreleasées.
Pour l'instant, ça marche, les classes sont bien instanciées avec les valeurs par défaut réglées dans le modèle.
Maintenant, j'enregistre le document (le contenu est bon, j'ai vérifié dans le XML), et je le recharge, et ça ne va plus: en effet, je ne saisis pas du tout comment je suis sensé instancier les Rect et Color.
Ma première idée était de mettre le même code dans -awakeFromFetch que celui de -awakeFromInsert, mais évidemment ça ne marche pas, puisque ça me crée un Rect et un Color avec les valeurs par défaut...
Mon dernier essai était le suivant:
Ok, je sais, c'est stupide, mais j'essaie tout
Quelqu'un saurait-il m'aiguiller SVP !
Comment Core Data instancie-t-il les entités avec lesquelles une classe a des relations ?
Imaginons qu'on ait deux NSArrayController instanciées dans IB, qui déclarent maintenir le même type de classe, et se rapportant au même managed object context. Comment CoreData va-t-il faire pour savoir dans lequel il faut instancier les classes?
Merci beaucoup d'avance.
Je précise que je programme à destination de 10.4 et 10.5 (donc pas d'ObjC 2.0)
J'ai beau lire et relire la doc d'Apple, moissonner les forums et autopsier les programmes d'exemple d'Apple (totalement inutiles, comme d'habitude), je n'arrive pas à trouver réponse à mes questions. >:(
Soit un simple modèle:
Nous allons dire que Shape, Rect et Color sont toutes des classes héritées de NSManagedObject, respectivement ShapeManagedObject, RectManagedObject et ColorManagedObject.
Les instances de ShapeManagedObject sont stockées dans un NSArrayController, instancié sous IB.
Lorsqu'un ShapeManagedObject est créé (target Add: de NSArrayController), sa méthode -awakeFromInsert est appelée. J'en profite pour lui lier ses deux relations, puisque la doc dit que je suis responsable de l'instanciation:
<br />- (void) awakeFromInsert<br />{<br /> [super awakeFromInsert];<br /> <br /> _rect = [NSEntityDescription insertNewObjectForEntityForName:@"Rect" inManagedObjectContext:[self managedObjectContext]];<br /> [_rect retain];<br /> <br /> _color = [NSEntityDescription insertNewObjectForEntityForName:@"Color" inManagedObjectContext:[self managedObjectContext]];<br /> [_color retain];<br />}<br />
_rect et _color sont deux variables d'instance.
Remarquez les retain, puisque la doc précise que les entités sont autoreleasées.
Pour l'instant, ça marche, les classes sont bien instanciées avec les valeurs par défaut réglées dans le modèle.
Maintenant, j'enregistre le document (le contenu est bon, j'ai vérifié dans le XML), et je le recharge, et ça ne va plus: en effet, je ne saisis pas du tout comment je suis sensé instancier les Rect et Color.
Ma première idée était de mettre le même code dans -awakeFromFetch que celui de -awakeFromInsert, mais évidemment ça ne marche pas, puisque ça me crée un Rect et un Color avec les valeurs par défaut...
Mon dernier essai était le suivant:
<br />- (void) awakeFromFetch<br />{<br /> [super awakeFromFetch];<br /> <br /> _rect = [self valueForKey:@"Rect"];<br /> [_rect retain];<br /> <br /> _color = [self valueForKey:@"Color"];<br /> [_color retain];<br /> <br />}<br />
Ok, je sais, c'est stupide, mais j'essaie tout
Quelqu'un saurait-il m'aiguiller SVP !
Comment Core Data instancie-t-il les entités avec lesquelles une classe a des relations ?
Imaginons qu'on ait deux NSArrayController instanciées dans IB, qui déclarent maintenir le même type de classe, et se rapportant au même managed object context. Comment CoreData va-t-il faire pour savoir dans lequel il faut instancier les classes?
Merci beaucoup d'avance.
Je précise que je programme à destination de 10.4 et 10.5 (donc pas d'ObjC 2.0)
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Et voici les réponses:
- Les NSArrayControllers ne stockent pas les NSManagedObjects ; ce sont de simples observateurs.
- C'est le Managed Object Context qui contient tous les objets qui sont dans le graph. Il est nécessaire d'associer les objets ainsi:
Au chargement, puisque le fichier contient aussi les relations entre les objets, Core Data n'a pas de difficulté à reconstituer le graph. C'est Core Data qui fait toutes les instanciations. Quant au NSArrayController, il est simple observateur, on lui aura donc forcément précisé quelles clefs du contexte il doit observer...