2009-07-04 23 views
7

Sto appena iniziando a utilizzare Core Data su iPhone SDK e sto cercando di salvare una lista ordinata, qualcosa come un array. Tuttavia, le relazioni nei Core Data sono espresse come Sets quando recuperate. Ciò rende difficile salvare l'ordine in cui sono posizionati gli oggetti.Relazioni indicizzate nei dati principali

Un buon esempio sono gli elementi di dati nella vista tabella quando è consentito riordinare gli articoli. Una soluzione facile sarebbe includere una proprietà dell'indice sull'oggetto gestito.

Si consideri il seguente gerarchia:

documento < -Molti-a-molti-> DataItem

casi documento diverso potrebbe collegarsi allo stesso DataItem, e ogni documento potrebbe fare riferimento a uno o più DataItem (s) . Quindi, avere una proprietà index in DataItem porterebbe a una minore riusabilità di tale istanza, cioè si può solo salvare l'indice per un'istanza di Documento.

Qualche idea su come è possibile presentare la gerarchia ordinata in modo ordinato in una vista tabella, mantenendo comunque ogni istanza DataItem riutilizzabile? Grazie!

risposta

3

Una buona soluzione è mantenere una struttura dati separata in Documento per mappare DataItems in una posizione nella vista tabella. Oltre a consentire lo stesso DataItem di esistere in più posizioni, se è necessario aggiungere un DataItem a più documenti, questa soluzione funzionerà anche.

Indietro quando stavo osservando diverse strategie per mantenere ordinati gli oggetti di Core Data, ho trovato un blog post che spiega come farlo in modo molto dettagliato, incluso anche il codice di esempio.

7

Si potrebbe fare con un altro soggetto, in questo modo: alt text http://gallery.me.com/davedelong/100084/Screenshot-20on-202009-07-04-20at-2010-34-56-20AM/web.jpg?ver=12467253090001

Un documento potrebbe trovare i suoi DataItems effettivi utilizzando qualcosa di simile:

NSSet * documentDataItems = [[document orderedDataItems] valueForKey:@"dataItem"]; 

Allo stesso modo, un DataItem riusciva a trovare tutti i suoi documenti facendo lo stesso:

NSSet * dataItemDocuments = [[dataItem orderedPositions] valueForKey:@"document"]; 
+0

L'immagine sembra essere rotta. –

+0

@ BJ Homer - grazie; Apparentemente a twitpic non piace il collegamento statico. L'ho caricato su MobileMe. –

15

A partire da OS X Lion (10.7) questo è ora molto più semplice. Cocoa ora ha il supporto per una nuova classe NSOrderedSet che è compatibile con Core Data. Questa funzionalità è disponibile anche in iOS, ma richiede iOS 5.0 o versioni successive. Ciò significa che non può essere utilizzato se vuoi che la tua app sia retrocompatibile con le versioni precedenti di iOS o OS X.

Tutto quello che devi fare per ottenere l'ordine è aprire l'editor del modello Core Data, selezionare a -questa relazione e controlla la casella di controllo "ordinata".

+0

Conosci qualche documentazione su questa nuova API? L'ho visto solo ufficialmente discusso nelle note di rilascio. Vorrei scoprire, ad esempio, come visualizzare i record in base a questo ordine in una vista tabella – Dov

+0

C'è il collegamento nella mia risposta originale al riferimento di classe di NSOrderSet. Tuttavia, non conosco nulla di specifico relativo ai casi di utilizzo ottimale all'interno delle visualizzazioni di tabella. –

+1

'NSOrderedSet' non può essere utilizzato insieme a iCloud. –

Problemi correlati