Core Data: Instanciation des entités liées

CéroceCéroce Membre, Modérateur
11:43 modifié dans API AppKit #1
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:
Relations.png

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:@&quot;Rect&quot; inManagedObjectContext:[self managedObjectContext]];<br />	[_rect retain];<br />	<br />	_color = [NSEntityDescription insertNewObjectForEntityForName:@&quot;Color&quot; 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:@&quot;Rect&quot;];<br />	[_rect retain];<br />	<br />	_color = [self valueForKey:@&quot;Color&quot;];<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)

Réponses

  • CéroceCéroce Membre, Modérateur
    11:43 modifié #2
    J'ai fini par demander sur la mailing list d'Apple.
    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:

    <br />- (void) awakeFromInsert<br />{<br />	[super awakeFromInsert];<br />	<br />	NSManagedObject* theRect = [NSEntityDescription insertNewObjectForEntityForName:@&quot;Rect&quot; inManagedObjectContext:[self managedObjectContext]];<br />	[self setValue: theRect forKey:@&quot;rect&quot;];<br />	<br />	NSManagedObject* theColor = [NSEntityDescription insertNewObjectForEntityForName:@&quot;Color&quot; inManagedObjectContext:[self managedObjectContext]];<br />	[self setValue: theColor forKey:@&quot;color&quot;];<br />}<br />
    


    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...

Connectez-vous ou Inscrivez-vous pour répondre.