2012-03-19 17 views
6

Ho iniziato a utilizzare CoreData nella mia applicazione seguendo le lezioni di Stanford CS193P riguardanti l'uso della nuova classe di iOS 5 UIManagedDocument. L'approccio in sé è abbastanza semplice, ma non riesco a capire come affrontare le modifiche ai modelli che continuo a fare. Questo è quanto ho un'istanza di mio oggetto UIManagedDocument (all'interno del AppDelegate, in modo che ogni altra classe può usarlo):Problemi di migrazione con UIManagedDocument

if (!self.database) { 
    NSURL *url=[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
    url = [url URLByAppendingPathComponent:@"AppName"]; 

    UIManagedDocument *doc = [[UIManagedDocument alloc] initWithFileURL:url]; 
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
          [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
          [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 
    doc.persistentStoreOptions = options; 
    self.database=doc; 
    [doc release]; 
} 

Il problema che ho è che ogni volta che cambia anche un po 'del mio .xcdatamodel, ho Sono in grado di ottenere tutto il contenuto precedentemente memorizzato nel documento e creare qualsiasi nuova istanza. È un dato di fatto fare questo genera la seguente eccezione:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.' 

ho pensato che l'impostazione del "opzioni" di proprietà del documento gestito avrebbe risolto il problema, ma a quanto pare questo non è sufficiente. Chiunque può aiutare? Impossibile trovare altre domande che corrispondano effettivamente alle mie precise esigenze.

+0

Ho seguito anche Stanford CS193P e ho riscontrato lo stesso errore. – coolcool1994

risposta

2

Prima di modificare il modello Core Data, è necessario "Aggiungi versione modello".

1. Selezionare il file del modello originale. (ad es. YourProject.xcdatamodel)

2. "Editor" -> "Aggiungi modello versione ...". Quindi aggiungi una nuova versione del modello (ad esempio 2.0)

3. Otterrai un nuovo file di modello. (ad es. YourProject 2.0.xcdatamodel). Modificalo.

4. Modificare la versione del modello corrente. Seleziona il file .xcdtatmodel in alto -> "Visualizza" -> "Utilità" -> "Mostra Impostazioni File". Trova il tag "Modello dati Core versione" e scegli la versione corretta che desideri modificare.

Mi ha anche disturbato per molto tempo. Spero che questo modo ti possa aiutare ^^

+0

Ciao. Grazie per la risposta. Sembra la buona strada da percorrere. Comunque, dopo aver seguito il tuo suggerimento, continuo a ricevere problemi di migrazione: *** Termina l'app a causa dell'eccezione non rilevata 'NSInvalidArgumentException', motivo: 'Impossibile unire modelli con due entità diverse denominate' ManagedChild '' dove ManagedChild è una delle entità nel mio modello. Ho trovato questa [voce] (http://stackoverflow.com/questions/3205783/core-data-error-cant-merge-models-with-two-different-entities-named-foo) ma non usa il samy UIManagedDocument approach as you need ... – micamoita

+0

Ho lo stesso problema. Tutta la documentazione dice che aggiungere "persistentStoreOptions" è la strada da percorrere. Ma ottengo un ritorno nullo da UIManagedDocument con gli stessi messaggi di errore. L'eliminazione del negozio non è un'opzione valida per me, dal momento che sto supportando un'app rilasciata. –

+0

Solo un altro punto dati ...Ho creato un progetto di esempio che sta inizializzando i Core Data tramite UIManagedDocument esattamente nello stesso modo in cui sto facendo nella mia app, ma il progetto di esempio sembra migrare bene (anche senza persistenteStoreOptions). –

0

C'è una soluzione davvero semplice al tuo problema. Basta cancellare l'app dal simulatore o dal dispositivo (toccare l'icona dell'app per alcuni secondi e toccare la croce che appare quando le icone delle app iniziano a dimenarsi). In questo modo, Xcode aggiorna UIManagedDocument della tua app.

+1

e cosa succede se l'app è già nel negozio. visualizzi una visualizzazione di avviso e chiedi agli utenti di reinstallare la tua applicazione? – MrBr

+0

Penso che la risposta di pH-k sia ciò di cui l'interrogante ha bisogno dal momento che sta seguendo un tutorial, non per pubblicare un'app al negozio :) – Philip007

+0

questo non mi ha aiutato. Il negozio persistente non è disponibile dice, ma lo ho chiaramente! – coolcool1994

0

Assicurarsi di non aver digitato NSDocumentDirectory come NSDocumentationDirectory.

NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 

NSDocumentDirectory ha ragione!

Problemi correlati