2009-08-03 18 views
6

Ho creato tutti i miei oggetti gestiti dopo aver mappato tutte le entità/attributi/relazioni nel modello dati. Ora ho il problema di dover aggiungere ulteriori attributi/relazioni a cui non ho pensato quando ho progettato per la prima volta una delle mie entità/classi. C'è un modo per modificare la mia classe NSManagedObject esistente con Core Data a corto di cancellare tutti i miei modelli e ricrearli in base al nuovo xcdatamodel?Aggiunta di attributo all'entità in Dati principali

Aggiungendo l'attributo nel xcdatamodel aggiornare anche il meccanismo di archiviazione sottostante? Dite se sto usando SQLite3 come memoria persistente, aggiungerà la colonna di conseguenza?

risposta

8

Se si intende "posso cambiare il mio xcdatamodel e unire semplicemente le modifiche dal codice generato al mio codice esistente per le classi derivate NSManagedObject", sì, è semplice. Devi solo generare il codice per i modelli che sono stati modificati, quindi unire le modifiche manualmente in quelle particolari classi derivate. Dato che i cambiamenti sembrano essere solo attributi e relazioni aggiuntivi, questo dovrebbe essere banale - in effetti, è possibile utilizzare diff e patch per farlo in modo semi-automatico se le tue modifiche sono veramente additive in natura.

Tuttavia, se si intende che è necessario migrare un negozio esistente in un nuovo schema, è necessario un lavoro in anticipo. Ci sono alcune condizioni (aggiungendo entità ortogonali, proprietà recuperate, ecc.) Che non ti obbligheranno a farlo. Ti renderai conto se devi o meno quando tenti di aggiungere i tuoi negozi persistenti esistenti al coordinatore dell'archivio permanente per il tuo contesto dell'oggetto gestito.

Prima di decidere di intraprendere una modifica dello schema, è necessario leggere sempre come eseguire migrations and versioning in Dati principali, se si dispone di archivi esistenti da conservare. Questo è quasi sicuramente il caso nelle app che hanno i dati dell'utente memorizzati negli archivi dei Core Data. E a meno che tu non abbia uno strumento di importazione automatizzata o una utility per la generazione di archivi di dati, è probabile che anche i depositi statici esistenti necessitino di migrazione.

0

Si dovrebbe anche controllare i picchietti di disegno di Gap Generation. Ti aiuterà esattamente in questa situazione. Here è una domanda SO sull'utilizzo di un gap generazionale con CoreData.

9

Come ricorda la marmotta, per modifiche complesse al modello di dati è necessario creare versioni del modello e migrare i dati nel modello precedente in quello nuovo, seguendo la guida di Apple sull'argomento (a cui si collega) . Non preoccuparti di nessuno degli SQL dietro le quinte, i dati di base vengono gestiti per te.

Tuttavia, per semplici modifiche al modello di dati, Apple ha introdotto una nuova funzionalità nell'implementazione di Core Data di iPhone 3.0 denominata lightweight migration. Per la migrazione lightwight, Core Data eseguirà automaticamente la migrazione attraverso semplici modifiche nel modello dati, come la modifica del nome di un attributo o entità, l'eliminazione di un attributo, l'aggiunta di un attributo con un valore predefinito o la modifica dell'ereditarietà di un'entità. Devi solo inserire l'identificatore di ridenominazione nella nuova versione per fare riferimento al nome della versione precedente per qualcosa, ecc. I Dati principali gestiranno gli aggiornamenti dei tuoi dati in modo efficiente, purché si impostino le opzioni NSMigratePersistentStoresAutomaticallyOption e NSInferMappingModelAutomaticallyOption su il tuo negozio persistente.

+2

Ho trovato [Core Data Migration and Versioning] (http://www.timisted.net/blog/archive/core-data-migration/) abbastanza chiaramente riempie gli spazi vuoti lasciati nella documentazione Apple. 'Design> Data Model> Add Model Version' in Xcode era il passo che mi mancava. –

+0

Nota: per ottenere il valore predefinito impostato per i nuovi attributi di oggetti esistenti, è necessario deselezionare il flag "opzionale". – Klaas

+0

Il collegamento @ShaunInman non è disponibile –

Problemi correlati