Core data + bindings + chargement
Chacha
Membre
Salut,
Je suis enchanté de Core Data, qui est incroyablement bien fait, et un peu moins des bindings, que je maà®trise assez mal; j'arrive cependant à utiliser les deux. Mais j'ai voulu utiliser les deux ensembles, et là j'ai un problème. En fait, ça marche, mais ça ne le montre pas.
Voilà le contexte:
J'ai un model, un contexte, un persistent store coordinator et des managed objects qui vont très bien ensemble, merci pour eux ;-). Or, je voudrais m'en servir en conjonction avec une NSTableView chargée d'afficher les entités du modèle.
J'ai donc un NSArrayController, dont j'ai défini le "managedObjectContext" à l'instance qui va bien. Je n'ai pas défini son "content", qui n'est pas fait pour ça dans le cas présent. Dans l'inspecteur d'attributes du arrayController, je le mets également en mode "entity", et je définis correctement le entityName.
Ensuite, je dois créer les liens entre ma tableView et le arrayController. Pour cela, j'utilise les bindings, et associe le "content" de la tableView aux "arrangedObject" du controller. Vous suivez toujours ? ;-) Notez que je ne parle pas encore du delegate et de la datasource de la tableView; j'y viens un peu plus tard.
Les explications compliquées sont terminées. Voilà maintenant les symptômes :
Au début, ma tableView est vide. J'arrive à y insérer des objets par des appels à "addObject" sur le arrayController; ça s'affiche, et ça s'insère en plus dans le modèle, c'est merveilleux. Puis je quitte le programme, et mon persistent coordinator me crée un fichier qui contient mes données.
Je relance mon programme, et ma tableView est censée afficher mes données, mais elle reste désespérément vide. Je peux alors continuer à insérer des données avec la méthode habituelle, mais les "anciennes" n'apparaissent toujours pas. Cependant, si je quitte mon programme, le fichier créé est plus gros qu'avant : mes anciens objets n'ont donc pas été détruits.
D'après moi, le problème est que je n'arrive pas à "charger" le contexte en mémoire depuis le persistentCoordinator. Mais d'après la doc de CoreData, le chargement est paresseux, c'est-à -dire que les managedObjects ne seront chargés qu'au besoin, planqués qu'ils sont derrière un "fault" object. Donc ça explique pourquoi je n'ai trouvé aucune méthode de chargement. Cela dit, après le chargement, si j'essaye d'afficher les "registeredObjects" du contexte, il n'y a rien dedans (et ma tableView est vide). Pourtant, les anciens objets ne sont pas perdus puisque la taille du fichier augmente !
Enfin, je glisse un mot sur le dataSource et le delegate de la tableView. Au début, je ne les avait pas fixés, pensant que puisque je bindais à un arrayController, c'est ce dernier qui se chargeait de tout. Pourtant, j'ai découvert que je pouvais (devais!) quand même les connecter à un autre objet (genre mon NSDocument) qui interroge le arrayController pour répondre aux classiques "objectValueForTableColumn" et "willDisplayCell".
Voilà où j'en suis. Si vous pouvez m'aider dans mes recherches, je suis preneur de tout aiguillage.
+
Chacha
Je suis enchanté de Core Data, qui est incroyablement bien fait, et un peu moins des bindings, que je maà®trise assez mal; j'arrive cependant à utiliser les deux. Mais j'ai voulu utiliser les deux ensembles, et là j'ai un problème. En fait, ça marche, mais ça ne le montre pas.
Voilà le contexte:
J'ai un model, un contexte, un persistent store coordinator et des managed objects qui vont très bien ensemble, merci pour eux ;-). Or, je voudrais m'en servir en conjonction avec une NSTableView chargée d'afficher les entités du modèle.
J'ai donc un NSArrayController, dont j'ai défini le "managedObjectContext" à l'instance qui va bien. Je n'ai pas défini son "content", qui n'est pas fait pour ça dans le cas présent. Dans l'inspecteur d'attributes du arrayController, je le mets également en mode "entity", et je définis correctement le entityName.
Ensuite, je dois créer les liens entre ma tableView et le arrayController. Pour cela, j'utilise les bindings, et associe le "content" de la tableView aux "arrangedObject" du controller. Vous suivez toujours ? ;-) Notez que je ne parle pas encore du delegate et de la datasource de la tableView; j'y viens un peu plus tard.
Les explications compliquées sont terminées. Voilà maintenant les symptômes :
Au début, ma tableView est vide. J'arrive à y insérer des objets par des appels à "addObject" sur le arrayController; ça s'affiche, et ça s'insère en plus dans le modèle, c'est merveilleux. Puis je quitte le programme, et mon persistent coordinator me crée un fichier qui contient mes données.
Je relance mon programme, et ma tableView est censée afficher mes données, mais elle reste désespérément vide. Je peux alors continuer à insérer des données avec la méthode habituelle, mais les "anciennes" n'apparaissent toujours pas. Cependant, si je quitte mon programme, le fichier créé est plus gros qu'avant : mes anciens objets n'ont donc pas été détruits.
D'après moi, le problème est que je n'arrive pas à "charger" le contexte en mémoire depuis le persistentCoordinator. Mais d'après la doc de CoreData, le chargement est paresseux, c'est-à -dire que les managedObjects ne seront chargés qu'au besoin, planqués qu'ils sont derrière un "fault" object. Donc ça explique pourquoi je n'ai trouvé aucune méthode de chargement. Cela dit, après le chargement, si j'essaye d'afficher les "registeredObjects" du contexte, il n'y a rien dedans (et ma tableView est vide). Pourtant, les anciens objets ne sont pas perdus puisque la taille du fichier augmente !
Enfin, je glisse un mot sur le dataSource et le delegate de la tableView. Au début, je ne les avait pas fixés, pensant que puisque je bindais à un arrayController, c'est ce dernier qui se chargeait de tout. Pourtant, j'ai découvert que je pouvais (devais!) quand même les connecter à un autre objet (genre mon NSDocument) qui interroge le arrayController pour répondre aux classiques "objectValueForTableColumn" et "willDisplayCell".
Voilà où j'en suis. Si vous pouvez m'aider dans mes recherches, je suis preneur de tout aiguillage.
+
Chacha
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Maintenant, il faut que je comprenne pourquoi quand j'appelle "removeObject" du controller ça ne marche pas, alors que le "remove" du context donne le résultat escompté.
Par contre je suis parti du principe de Binder au maximum, donc le moins de code glue possible...Pour l'instant je ne parviens pas lier d'une façon ou d'une autre le ManagedObjectContext... Je me perd un peu dans les binds et les liens...
Pour l'instant ça compile sans erreur, mais le New Document génère l'erreur suivante:
visiblement il manque qqch, as-tu une idée ?