2012-02-16 8 views
7

Sto cercando di creare un semplice modello di Core Data simile al seguente:modello e popolano Core Data molti-a-molti con l'attributo

Order(code, customer) 
Book(code, title, price) 
OrderBook(order_code, book_code, quantity) 

Dalla documentazione Core Data vedo che non è possibile modellare una relazione molti-a-molti aggiungendo attributi. Per questo motivo l'ho modellato come il seguente.

enter image description here

dove:

  • Order-OrderBook c'è un rapporto uno-a-molti con una regola di eliminazione Cascade
  • forma OrderBook-Order c'è un relazione uno-a-uno con una regola di cancellazione Nessuna azione

Lo stesso vale per Book e OrderBook.

Prima domanda: Questo modello è valido?

Supponendo che il modello sia ok, ho creato le sottoclassi NSManagedObject corrispondenti.

Book.h/.m 
Order.h/.m 
OrderBook.h/.m 

Ciò detto, hanno la necessità di popolare il db corrispondente mediante meccanismo Core Data. Per fare questo ho creato le categorie corrispondenti come la seguente, dove ogni categoria è responsabile di creare se stessa (per mantenere l'incapsulamento dell'oggetto).

Book+Creation.h/.m 
Order+Creation.h/.m 
OrderBook+Creation.h/.m 

Per esempio Book+Creation categoria ha un metodo di classe come il seguente:

+ (Book *)bookWithXMLElement:(GDataXMLElement *)xmlElement inManagedObjectContext:(NSManagedObjectContext *)context; 

ora ho un problema e non so come risolverlo.

La popolazione modello deve avvenire in momenti diversi. La tabella per i libri viene popolata per prima (sto creando un catalogo di libri da un file xml). Una volta terminato, sono in grado di popolare tabelle di ordini e ordini. Per popolare queste tabelle che sto utilizzando un file XML come la seguente:

<orders> 
    <order> 
    <code>1234</code> 
    <book>2567</book> 
    <customer>299</customer> 
    <quantity>4</quantity> 
    </order> 
</orders> 

Per creare un oggetto gestito Order ho creato il seguente metodo nella sua categoria Order+Creation:

+ (Order *)orderWithXMLElement:(GDataXMLElement *)xmlElement inManagedObjectContext:(NSManagedObjectContext *)context; 

Una volta creato, l'oggetto viene passato al OrderBook+Creation categoria metodo di classe per creare un oggetto OrderBook gestito:

+ (OrderBook *)orderWithXMLElement:(GDataXMLElement *)xmlElement withOrder:(Order*)order inManagedObjectContext:(NSManagedObjectContext *)context 
{ 
    OrderBook* orderBook = [NSEntityDescription insertNewObjectForEntityForName:@"OrderBook" inManagedObjectContext:context]; 
    orderBook.order = order; 
    //orderBook.book = <-- how can I retrieve the book? 

    return orderBook; 
} 

Ciò che manca è come creare (o recuperare) l'oggetto Book per assegnarlo all'oggetto OrderBook.

Seconda domanda: Come posso recuperare un oggetto Book e assegnarlo a OrderBook? Devo creare un NSFetchRequest per recuperare l'oggetto giusto Book (quello che ha lo stesso codice nel file xml, ad esempio <book>2567</book>)? In tal caso, esiste un meccanismo per migliorare le prestazioni per l'acquisizione di rquest?

Ricordare che la tabella del libro è già popolata.

Spero sia chiaro. Grazie in anticipo.

+0

Mi dispiace, ma perché downvote? –

+0

Con il modello corrente, se si dispone di un oggetto di ordine che ha sia un libro che un attributo di ordine, se si elimina il libro o l'ordine, l'oggetto del book degli ordini verrà rimosso. E 'questo quello che vuoi? – jrturton

+0

@jrturton grazie per la vostra risposta. Sì, è quello che voglio. Hai qualche suggerimento? –

risposta

3
  1. Dovrebbe essere "nullify" non "nessuna azione" per le relazioni to-one.
  2. Sì, hai ragione, hai bisogno di una richiesta di recupero.

In caso di problemi di prestazioni con il recupero richiesta (difficile da dire senza conoscere i numeri coinvolti) si potrebbe prendere l'intera serie di libri in memoria (di nuovo, potrebbe non essere pratico a seconda del numero) e poi usare filtro/enumerazione degli array per trovare l'elemento specifico, ma è necessario creare e profilare l'opzione più semplice.

I tipi di regole di eliminazione sono descritti here, vanificare è corretto per il rapporto a uno da portafoglio ordini al Libro and Order:

Nullify

Impostare la relazione inversa per gli oggetti a destinazione a null.

Ad esempio, se si elimina un reparto, impostare il reparto per tutti i membri correnti su null. Ciò ha senso solo se la relazione di reparto per un dipendente è facoltativa o se si assicura di impostare un nuovo reparto per ciascuno dei dipendenti prima della successiva operazione di salvataggio.

Ciò significa che se si elimina un orderBook, viene rimosso dagli ordini bookbook e bookOrders nelle entità Order e Book.

+0

Grazie. La popolazione della tabella viene eseguita in background mediante una NSOperation. Cosa intendi con "dovresti sicuramente costruire e profilare prima l'opzione più semplice"? +1 per il tuo supporto. –

+1

Voglio dire, scrivilo con una richiesta di recupero (devi solo crearlo una volta, puoi semplicemente modificare il predicato) e usare l'oggetto libro restituito quando compili il tuo ordine. Non provare nient'altro finché ea meno che ciò non causi problemi. – jrturton

+0

Una domanda semplice per te. È corretto che ** da OrderBook a Order ci sia una relazione one-to-one con una regola di cancellazione Nessuna azione ** ?. Quando imposto questo il compilatore mi dà un errore di coerenza. Forse se uso la regola NULLIFY potrebbe essere più corretto. Che cosa ne pensi? Grazie. –