2010-09-24 12 views
8

Ho un'app per iPhone che utilizza CoreData. Di recente ho apportato alcune modifiche minori al modello di dati e ora ogni volta che si apre l'app viene visualizzato l'errore "Impossibile trovare il modello per l'archivio di origine".La migrazione di CoreData iPhone non riesce con "Impossibile trovare il modello per l'archivio di origine"

Ho 2 versioni del modello dati e le uniche modifiche apportate sono state alcune aggiunte di alcuni campi. Stavo seguendo la guida here che funzionava inizialmente, quindi solo oggi, dopo aver aggiunto alcuni campi aggiuntivi, si interrompe. Tutti i campi aggiuntivi sono contrassegnati come facoltativi e tutti hanno valori predefiniti. Il codice di migrazione è seguito:

NSURL *storeUrl = [NSURL fileURLWithPath:[[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"xxx.sqlite"]]; 

// migration options 
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 

NSError *error = nil; 
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 

if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) { 
... 
} 

Il managedObjectModel viene creato correttamente qui:

- (NSManagedObjectModel *)managedObjectModel { 

if (managedObjectModel != nil) { 
    return managedObjectModel; 
} 

NSString *path = [[NSBundle mainBundle] pathForResource:@"DataModelName" ofType:@"momd"]; 
NSURL *momURL = [NSURL fileURLWithPath:path]; 
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL]; 

return managedObjectModel; 
} 

ho rintracciato il problema di una mancata corrispondenza nella versione ha per 1 soggetto. L'errore che viene gettato include questo ha per l'entità:

MyEntityName = <cc1456b7 b12d0d05 21930308 94ccc078 27a6c345 8847c738 e3a9ae7e 0be9535d>; 

ma l'hash nel VersionInfo.plist nel pacchetto applicazione è:

MyEntityName = <fede6b59 462442d1 8fc98226 b9f8f745 3250dabd ee188248 cb97b1d0 8a74eef3>; 

Non ci sono altri soggetti in tutto il VersionInfo. plist con l'hash <cc1456b7....>.

risposta

5

Dalla risposta legata,

Questo sembra grande e semplice come avrei voluto - ma penso che è necessario fare attenzione durante lo sviluppo come si cambia un modello - altrimenti si dovrà creare una nuova versione per ogni cambiamento.

suona come hai fatto la versione 2, a cura versione 2, è eseguito l'applicazione, a cura ancora una volta la versione 2, e corse di nuovo l'applicazione. Questo non funziona così bene; è necessario salvare tutte le versioni del modello che si prevede di poter aprire. Questo è un po 'una seccatura.

Ciò che si potrebbe fare è nominare tutti i modelli dopo le versioni dell'app, ad es. FooModel-1 e FooModel-1.1 corrispondenti alle versioni e FooModel-1.2d1, FooModel-1.2d2 per le versioni di "sviluppo". Prima del rilascio, è possibile rinominare FooModel-1.2d10 in FooModel-1.2 e rimuovere le altre versioni di sviluppo.

(O potrei essere del tutto fraintendendo la domanda;. Sorry)

+0

Ho sicuramente modificato la versione 2 dopo aver eseguito l'app. Quale sarebbe il modo migliore per procedere con questo? Sicuramente non voglio rilasciare questo in produzione e gli utenti perdono i loro dati perché ho incasinato durante dev. Posso creare una versione 3 con le modifiche finali ed essere a posto? –

+0

Se non hai rilasciato la versione 2 per gli utenti, non avranno alcun problema. Stai avendo problemi perché hai salvato con "vecchia versione 2" e stai provando a caricarlo con "nuova versione 2". Aggiungere nuove versioni non necessarie del modello non fa male, però; rende la tua app un po 'più grande. –

+0

Eccellente. Stavo andando fuori di testa perché alcuni dei nostri tester interni stavano ricevendo errori, ma probabilmente a causa dello stesso problema che stavo eseguendo una versione con più modifiche. –

0

bene nel mio caso esattamente la stessa cosa stava accadendo ed ero su iOS 7 e questo problema fregato la mia testa per almeno una settimana e poi finalmente trovare la soluzione che funziona per me . Per farlo funzionare devi aggiungere un valore extra nelle opzioni utilizzate per aggiungere PersistentStore e poi vai (non sono sicuro della versione di iOS ma sì, funzionerà sicuramente su iOS 7).

-(NSManagedObjectModel *)managedObjectModel 
{ 
    if (managedObjectModel != nil) 
    { 
     return managedObjectModel; 
    } 
    managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil]; 
    return managedObjectModel; 
} 

-(NSPersistentStoreCoordinator *)persistentStoreCoordinator 
{ 

    if (persistentStoreCoordinator != nil) 
    { 
     return persistentStoreCoordinator; 
    } 

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"ABC.sqlite"]; 

    NSError *error = nil; 
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] ini tWithManagedObjectModel:[self managedObjectModel]]; 

//Creating Lightweight migration. 
    NSDictionary *options = 
    @{ 
     NSMigratePersistentStoresAutomaticallyOption:@YES 
     ,NSInferMappingModelAutomaticallyOption:@YES 
     ,NSSQLitePragmasOption: @{@"journal_mode": @"DELETE"} 
    }; 


    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) 
    { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 
return persistentStoreCoordinator; 
} 
Problemi correlati