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.