2010-02-24 12 views
20

Nel mio modello Core Data Ho due entità: Lista e paziente. L'elenco ha un attributo chiamato "nome".dati core molti-a-molti - domanda predicato

Un elenco può avere qualsiasi numero di pazienti e di ogni paziente può appartenere a qualsiasi numero di liste diverse. Ho quindi impostare una relazione nella lista denominata 'pazienti' che ha un'inversa a-molti al paziente e una relazione sul paziente chiamato 'liste' che ha una relazione a-molti all'elenco.

Quello che sto lottando per capire è come creare un predicato che selezionerà tutti i pazienti che appartengono ad un particolare nome di elenco.

Come dovrei fare questo? Non ho mai usato le relazioni prima in Core Data.

Grazie,

risposta

14

Questo sembra funzionare bene:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(ANY lists == %@)", myList]; 

Dove myList è un'entità lista attuale.

+0

Grazie Garry, ho cercato questa soluzione per un po ', risulta essere facile: P – Nick

9

Sembra che il tuo modello di dati è questa:

Lista < < - >> paziente

Vorrei pensare che se si conosce il nome particolare lista, poi si sa l'oggetto della lista particolare. Se è così, si può semplicemente prendere i pazienti utilizzando la relazione a-molti da List per paziente - si tratta di un insieme di oggetti del paziente. Ad esempio, se il rapporto dall'elenco a paziente si chiama "pazienti":

NSSet *patientSet = listObject.patients; 

Nota: questo richiede la creazione di sottoclassi per i vostri oggetti gestiti in modo da poter accedere agli attributi e relazioni come proprietà sui vostri oggetti.

Se si conosce solo il nome dell'elenco per qualche motivo e si stanno recuperando gli oggetti paziente, è possibile creare un predicato utilizzando la relazione to-many da Paziente a Elenco (si supponga che sia denominato "elenchi" e il nome dell'elenco in una stringa denominata "nomeLista"):

NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY lists.name == %@",listName]; 
+4

Nel primo esempio (che è corretto come al solito da gerry3), è possibile accedervi tramite KVC senza dover eseguire la sottoclasse mediante 'NSSet * patientSet = [listObject valueForKey: @" patients "];' –

+2

Ma come si fa? "converti" in controller dei risultati recuperati? Ho anche la stessa domanda e ho il riferimento all'oggetto "list", ma mi piacerebbe avere un controller dei risultati recuperato che mostri "list.pazienti " – Nick

+0

In realtà, la risposta da @Garry di seguito è ciò che stavo cercando – Nick

18

Dato un modello di dati come:

lista < < - >> paziente,

è possibile trovare tutte le istanze di pazienti che appartengono ad una lista con un particolare Nome LAR con una richiesta di recupero sull'entità del paziente utilizzando un predicato come:

[NSPredicate predicateWithFormat:@"ANY lists.name LIKE[cd] %@", listName] 

assumendo listName è un'istanza NSString con il nome della lista che si desidera. LIKE[cd] fa un confronto case-insensitive e diacritic-insensibile.

+0

Ho l'entità Elenco in memoria e la passiamo a una sottoclasse UITableViewController.Come potrei costruire una richiesta di recupero per afferrare tutti i pazienti da quell'entità lista ? Sto cercando di utilizzare un NSFetchedResultsController e il nome di una lista non è univoco (quindi la costruzione di un predicato basato solo sul nome potrebbe causare errori) – Garry