Pagine

2012-05-19

Tabelle dipendenti

Supponiamo di avere un'applicazione Core Data con due Entity, Persona e Figlio. Queste abbiano le seguenti proprietà:

Persona {nome, cognome, figli}
Figlio {nome, eta, padre}


dove figli e padre sono relationship, la prima è one-to-many (un padre può avere più figli), la seconda è one-to-one (un figlio ha un solo padre) e ciascuna indica l'altra come relazione inversa.
Vogliamo far comparire nella prima tabella il nome di tutte le persone, mentre nella seconda dovranno comparire non tutti i figli (che sarebbe semplice), ma solo quelli il cui padre è selezionato nella prima tabella.

Inseriamo tutti i normali oggetti richiesti dall'architettura Core Data: nel nib mettiamo due NSArrayController (PersoneController e FigliController), entrambi avranno la proprietà ManagedObjectContext legata via binding (in InterfaceBuilder) alla proprietà ManagedObjectContext dell'AppDelegate.
Le prime due colonne della prima tabella (quella che deve contenere le Persone) avranno i seguenti binding:

Prima colonna (nome):

Value
Bind to: PersoneController
Controller Key: arrangedObjects
Model Key Path: nome


Seconda colonna (cognome):

Value
Bind to: PersoneController
Controller Key: arrangedObjects
Model Key Path: cognome


Analogamente, per la colonna nome della seconda tabella, quella dei Figli:

Value
Bind to: FigliController
Controller Key: arrangedObjects
Model Key Path: nome


Ora però si tratta di dire a Cocoa che il contenuto di FigliController non deve essere tutta la serie delle Entity Figlio, ma solo una parte.
Tenendo conto che una relationship one-to-many è descritta tramite un NSSet, la cosa si risolve effettuando il binding del Content Set del controller; per cui selezioniamo FigliController nel nib e imponiamo:

Content Set
Bind to: PersoneController
Controller Key: selection (consideriamo la relazione della persona selezionata)
Model Key Path: figli


Compiliamo e lanciamo: inseriamo un po' di dati e vediamo se abbiamo fatto tutto giusto!

NOTA: verrebbe spontaneo (almeno a me!) collegare il Value della colonna nome della seconda tabella ad un percorso tipo:
PersoneController.selection.figli.nome
ma se provate vedrete che non funziona: infatti alla colonna arriverebbe un NSSet, che il Value non può rappresentare.