Non esiste un array "nativo" o un tipo di dizionario in Core Data. È possibile memorizzare un NSArray
o un NSDictionary
come attributo trasformabile. In questo modo verrà NSCoding
serializzato l'array o il dizionario su un NSData
attributo (e opportunamente deserializzato al momento dell'accesso). Il vantaggio di questo approccio è che è facile. Il rovescio della medaglia è che non è possibile eseguire una query nell'array o nel dizionario (è archiviato come BLOB nell'archivio dati) e se le raccolte sono grandi, potrebbe essere necessario spostare molti dati da / verso l'archivio dati (se è un archivio dati SQLite) solo per leggere o modificare una piccola parte della raccolta.
L'alternativa consiste nell'utilizzare i dati di base tra più relazioni per modellare la semantica della raccolta di array o dizionari. Le matrici sono più semplici, quindi cominciamo con quello. Le relazioni tra molti dati di base stanno davvero modellando un set, quindi se hai bisogno di funzionalità simili a array, devi ordinare il set (usare una proprietà recuperata è un modo conveniente per farlo) o aggiungere un attributo di indice extra all'entità che memorizza gli elementi dell'array e gestisce gli indici da soli. Se si memorizza un array omogeneo (tutte le voci sono dello stesso tipo), è facile modellare la descrizione dell'entità per le entità dell'array. In caso contrario, dovrai decidere se utilizzare un attributo trasformabile per archiviare i dati dell'articolo o creare una famiglia di entità articolo.
La modellazione di un dizionario richiederà probabilmente una relazione a molti con un insieme di entità che memorizza una chiave e un valore. Sia la chiave che il valore sono analoghi all'entità articolo per l'array, descritto sopra. Quindi potrebbero essere tipi nativi (se li conosci in anticipo), un attributo trasformabile o una relazione con un'istanza di una famiglia di entità specifiche del tipo.
Se tutto ciò suona un po 'scoraggiante, lo è. Trasformare i dati arbitrari in un framework dipendente dallo schema come Core Data è difficile.
Per i dati strutturati, come gli indirizzi, è quasi sempre più facile passare il tempo a modellare esplicitamente le entità (ad esempio un attributo per ogni parte dell'indirizzo). Oltre a evitare tutto il codice aggiuntivo per modellare un dizionario, questo semplifica l'interfaccia utente (i binding "funzionano") e la logica di convalida, ecc. Molto più chiara, poiché gran parte di essa può essere gestita da Core Data.
Aggiornare
A partire da OS X 10.7, Core Data include un tipo di set ordinato che può essere utilizzato al posto di un array. Se puoi scegliere come target 10.7 o versioni successive, questa è la soluzione migliore per raccolte ordinate (simili a array).