CoreData-Interface Builder keyPath pour selection multiple

nicox05nicox05 Membre
06:46 modifié dans API AppKit #1
Bonjour,

Tout d'abord voici la structure CoreData :

Entité 'Commune'
  - Attribut 'nomCommune'
  - Relation 'lieuecRel' (One-To-many) vers entité 'lieuec'

Entité 'lieuec'
  - Attribut 'nomLieu'
  - Relation 'commune' (many-to-one) vers entité 'commune'

Dans IB, j'ai mis deux tables view et deux Array Controller (un 'Communes' et un 'lieuecs')
Pour le moment, j'ai mis un binding dans le 'Content set' vers 'Communes', controller key = 'Selection' et Model key Path = 'lieuecRel'
Ceci fonctionne quand je sélectionne une seule Commune dans le premier Table View. Comment faire pour pouvoir sélecitonner plusieurs communes et afficher la liste des lieux associés ? J'ai essayé de remplacé le Model Key Path par '@distinctUnionOfSets'; sans succès.

Pouvez-vous m'aider ?

Merci

Réponses

  • CéroceCéroce Membre, Modérateur
    06:46 modifié #2
    Pour la tableview, coche la case Multiple en face de Selection.
  • nicox05nicox05 Membre
    06:46 modifié #3
    La case "multiple" est bien cochée dans la première tableview (associée à  communes).
    Le problème est qu'une sélection multiple implique :
    - soit la 2eme table vide si model key path = 'lieuecRel'
    - soit une erreur si model key path = '@distinctUnionOfSets.lieuecRel'

    Merci
  • CéroceCéroce Membre, Modérateur
    février 2009 modifié #4
    Si ça peut te rassurer, je me penche " sérieusement cette fois " sur ton problème, sans avoir la solution.
    Ah ces bindings ! (Comme dirait No).
  • CéroceCéroce Membre, Modérateur
    06:46 modifié #5
    J'ai l'impression que le problème est que quand on crée un Lieu dans le NSArrayController Lieux, le lien n'est pas fait avec la sélection dans le NSArrayController Communes. Il n'existe pas de lien dans le MOC. Je continue à  chercher.
  • CéroceCéroce Membre, Modérateur
    06:46 modifié #6
    J'ai écrit un contrôleur pour associer le lieu aux communes sélectionnées:

    <br />@implementation LieuxCreationController<br /><br />- (IBAction) addLieu:(id)sender<br />{<br />	// Créer le Lieu<br />	NSManagedObject* lieu = [NSEntityDescription insertNewObjectForEntityForName:@&quot;Lieu&quot; inManagedObjectContext:[document managedObjectContext]];<br />	<br />	// Associer aux Communes actuellement sélectionnées<br />	NSArray*	selectedCommunes = [communesArrayController selectedObjects];<br />	for(NSManagedObject* commune in selectedCommunes)<br />	{<br />		// Obtenir la liste des lieux déjà  associés<br />		NSSet* lieuxAssocies = [commune valueForKey:@&quot;lieu&quot;];<br />		NSSet* nouveauxLieux = [lieuxAssocies setByAddingObject:lieu];<br />		<br />		[commune setValue:nouveauxLieux forKey:@&quot;lieu&quot;];		<br />	}<br />	<br />}<br /><br />@end
    


    Le code marche, on peut le vérifier dans le fichier XML pondu par l'appli.

    Par contre, je n'ai pas encore trouvé comment comment n'afficher que les lieux pour ces communes. Je dirais qu'on ne peut pas faire cela avec les bindings (NSArrayController est plutôt fait pour un fonctionnement "Master-Details"), et je pencherais pour lancer une requête sur la base de données comme tu le demandes dans ton autre message.
  • nicox05nicox05 Membre
    06:46 modifié #7
    Merci pour ton aide.
    Pour ma part, pour ajouter un lieu associé à  une commune, j'ai plutôt utilisé la relation reciproque (qui est donc one-to-many) c'est a dire [lieu setValue:commune forKey:@commune]

    Je pensais que l'on pouvait éviter d'utiliser des prédicats avec les binding et les opérateurs de key path (du genre @unionOfSets)

    Je vais creuser. J'en profite pour demander si quelqu'un connait des tutoriaux avancés pour core data, j'ai l'impression que ca manque un peu (rien en litterature meme si un livre en anglais doit sortir fin mai)

    Bon we
  • CéroceCéroce Membre, Modérateur
    06:46 modifié #8
    dans 1235907912:

    Je vais creuser. J'en profite pour demander si quelqu'un connait des tutoriaux avancés pour core data


    Il n'existe rien à  ma connaissance à  ce sujet, et c'est pas faut d'avoir cherché. J'ai laissé tombé parce que Core Data répondait assez mal aux besoins de mon projet, dont les objets sont organisés sous forme d'arbre: une BdD ne sert donc à  rien (j'ai préféré enregistrer en XML). Ce qui me gène le plus dans Core Data, c'est que la BdD est forcément locale. Sachant que Core Data est beaucoup plus compliquée à  mettre en oe“uvre qu'une simple base MySQL ou autre, et que la documentation d'Apple est navrante, je déconseillerais son utilisation dans 90% des projets.
Connectez-vous ou Inscrivez-vous pour répondre.