2015-03-24 6 views
10

Sto cercando di capire come modellare relazioni dati complesse con Core Data.iOS Swift - Esempi di dati di base con una relazione dati complessa

Con la mia app, al momento ho un'entità di Ricetta, Ingrediente e RecipeIngredient che legano gli ingredienti a una ricetta.

Non ho trovato alcun esempio di recupero dei dati da questa entità congiunta. Sarei grato se qualcuno potesse dare un esempio di un'entità come la mia RecipeIngredient in Swift.

+2

Che cosa è che non si capisce, e che si spera di impara da un esempio? –

risposta

15

Il motivo per cui non sono stati visualizzati esempi simili all'entità RecipeIngredient è che non sono necessarie entità comuni come quelle in Dati principali. Trattate i dati di base come se si trattasse di un database relazionale, in cui di solito utilizzate una tabella di join per creare relazioni efficienti molti-a-molti tra entità. Come spiegato nella sottosezione Many-to-Many Relationships dello Core Data Programming Guide, con Core Data tutto ciò che devi fare è specificare una relazione to-many in entrambe le direzioni tra due entità. Si noti l'osservazione parentesi nella documentazione:

(Se si dispone di un background in gestione di database e questo ti fa preoccupazione, non preoccupatevi: se si utilizza un negozio di SQLite, Core Data crea automaticamente aderire al intermedio . tavolo per voi)

Ecco un esempio del rapporto come si dovrebbe modellare, strappato direttamente dal editor di modello di Xcode:

many-to-many

Se desideri ancora vedere esempi su come eseguire questa operazione, cerca qualcosa come "Dati di base da molte a molte relazioni" e troverai molto. Potresti iniziare da qui su StackOverflow; una rapida ricerca ha trovato un certo numero di esempi, tra cui How do you manage and use "Many to many" core data relationships?.

Aggiornamento: Dal tuo commento, capisco che desideri utilizzare un oggetto intermedio per aggiungere informazioni sulla relazione tra ricette e ingredienti. Che è un caso in cui è giustificata un'altra entità. Quindi diciamo che il vostro modello è simile al seguente:

updated model

Sembra improbabile che ci si vuole prendere uno di questi oggetti RecipeIngredient direttamente; probabilmente seguirai semplicemente la relazione appropriata. Quindi, potresti creare una richiesta di recupero per trovare tutte le ricette il cui nome corrisponde a "torta al cioccolato". (Ci sono un sacco di esempi di richieste di recupero usando un predicato nei documenti e in tutta la rete, quindi non lo farò qui.) La tua richiesta di recupero restituirà una serie di ricette che potremmo chiamare cakeRecipes, ma tu sei probabilmente interessato solo a uno:

Recipe *cake = cakeRecipes.firstObject; 

Ora, cosa vuoi sapere sugli ingredienti per la tua torta? Ecco un elenco degli ingredienti:

NSArray *ingredientNames = cake.ingredients.ingredient.name; 

Se si desidera registrare i nomi degli ingredienti e gli importi:

for (RecipeIngredient *i in cake.ingredients) { 
    NSLog(@"%@ %@", i.amount, i.ingredient.name); 
} 

Oppure, si potrebbe utilizzare una richiesta per trovare gli ingredienti matching "sedano" fetch , memorizzando il risultato in celeries.Dopo di che, si potrebbe cercare ricette, tra cui sedano:

Ingredient *celery = celeries.firstObject; 
NSArray *recipes = celery.recipes.recipe 

Se questo non aiuta, forse si potrebbe essere più preciso circa il problema. Inoltre, so che hai chiesto di Swift, ma le mie dita sono ancora abituate a Obj-C, e le specifiche del linguaggio non entrano realmente in gioco qui - Core Data funziona allo stesso modo in entrambe le lingue.

+0

Grazie. Capisco che i dati di base non funzionano come un database relazionale. Se si guarda la sottosezione delle relazioni Molti-a-molti del documento Core Data, si parla di entità intermedia (comune) dove sarebbe opportuno se richiedesse un attributo aggiuntivo - nel mio caso, un attributo di misura nell'entità RecipeIngredient. Mi piacerebbe sapere come viene fatto il processo di recupero per questa entità congiunta. –

+0

Questo ha senso, ma non era chiaro dalla tua domanda. Non riesco però a vedere come il recupero sia un problema. È improbabile che tu voglia recuperare l'entità intermedia da sola, giusto? Quindi, basta usare la proprietà appropriata di un oggetto gestito (come una ricetta) che devi già raggiungere l'oggetto intermedio. Aggiornerò la risposta ... – Caleb

+1

Grazie mille per aver dedicato del tempo e condiviso le tue conoscenze. Adesso è molto più chiaro. –