it-swarm.it

Impossibile creare un NSPersistentStoreCoordinator con un modello nil

Ho avuto il mio primo crack in Core Data e sto ricevendo il seguente errore quando eseguo il mio codice sul mio dispositivo, ma funziona perfettamente sul simulatore.

* Termine dell'app a causa dell'eccezione non rilevata 'NSInvalidArgumentException', motivo: 'Impossibile creare un NSPersistentStoreCoordinator con un modello nil'

Alcuni dei miei metodi che potrebbero causare il problema:

    - (NSManagedObjectContext *)managedObjectContext
{
    if (__managedObjectContext != nil)
    {
        return __managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil)
    {
        __managedObjectContext = [[NSManagedObjectContext alloc] init];
        [__managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return __managedObjectContext;
}

/**
 Returns the managed object model for the application.
 If the model doesn't already exist, it is created from the application's model.
 */
- (NSManagedObjectModel *)managedObjectModel
{
    if (__managedObjectModel != nil)
    {
        return __managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"RugbyOnTv" withExtension:@"momd"];
    __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];    
    return __managedObjectModel;
}

/**
 Returns the persistent store coordinator for the application.
 If the coordinator doesn't already exist, it is created and the application's store added to it.
 */
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (__persistentStoreCoordinator != nil)
    {
        return __persistentStoreCoordinator;
    }

    NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"RugbyOnTV.sqlite"];

    NSURL *storeUrl = [NSURL fileURLWithPath:storePath];

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];    
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];

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


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

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    

    return __persistentStoreCoordinator;
}


    - (NSString *)applicationDocumentsDirectory {

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
        return basePath;
    }

MODIFICARE

Ho copiato e incollato il metodo managedObjectContext (sotto) dal CoreDataBooks di Apple e ora funziona ... Non so davvero perché

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

Ho avuto esattamente lo stesso messaggio di errore del post originale. Stavo lottando con questo per ore . Era questa linea nel mio AppDelegate.m.

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"[same with name of xcdatamodeld]" withExtension:@"momd"];

Per chiunque sia fuori a cercare questo messaggio di errore e trovando questo thread .... prova prima questo.

Devi assicurarti che dove dice [lo stesso con nome di xcdatamodeld] .... che sia !!! Per qualche ragione, il mio aveva il mio nome di progetto e non il nome del modello di dati.

Modificato e ha funzionato subito .....

Grazie a Rock & Muller per aver contribuito ....... mi hai salvato giorni !!

Gaz.

157
Gareth Lloyd

prima verifica:

NSLog(@"%@", [self managedObjectModel]);

Se ottieni un valore nullo, forse il problema è qui

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"RugbyOnTv" withExtension:@"momd"];

Quindi, prova a cambiare @ "momd" di @ "mamma"

54
D33pN16h7

Ho riscontrato un problema strano con Xcode 4.3.2 e iOS 5.

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"NAME_OF_THE_MODEL" withExtension:@"momd"];

restituisce un URL valido ma 

__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

restituisce un NSManagedObjectModel null. Ma dopo aver controllato documentation , sembra che NSManagedObjectModel abbia bisogno di un file dove NAME_OF_THE_MODEL.momd è una directory che contiene un file NAME_OF_THE_MODEL.mom. Modifica dell'URL su 

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"NAME_OF_THE_MODEL" withExtension:@"mom" subdirectory:@"NAME_OF_THE_MODEL.momd"];

allora funziona. Sembra strano però che Xcode generi codice che non funziona con se stesso ...

20
xster

Ho avuto questo problema e cambiare "mamme" a "mamma" non ha fatto nulla. Per risolvere il problema dovevo fare clic con il tasto destro del mouse sul file xcdatamodelId> mostra il contenuto del pacchetto, quindi eliminare il file .xcurrentversion nascosto.

P.S: Questo problema ha avuto inizio solo dopo che avessi cambiato il nome del file del modello di dati. 

19
JDx

Un'altra fonte di questo errore è che a volte Xcode non include il modello di dati nella build.

Controlla le fasi di costruzione del tuo obiettivo e assicurati che il file * .xcdatamodeld sia incluso nella sezione Origini di compilazione.

13
Dave Wood

Quello che è probabilmente successo è che il tuo file xcdatamodeld dal codice sorgente di Apple è diventato un file xcdatamodel (senza il d) e quindi non sono considerati uguali.

Il modo più rapido per risolvere questo problema è selezionare il file xcdatamodel nel navigatore del progetto e nella barra dei menu 

Editor->Add Model Version...

e aggiungi una nuova versione del tuo modello. Apporta tutte le modifiche alla nuova versione.

Funziona su Xcode 5

9
Louis Cremen

Lo risolvo aggiungendo il file db al Copy Bundle Resources

Vai alla radice del tuo progetto >> seleziona il tuo target >> Fasi di costruzione >> Copia le risorse del pacchetto. Assicurati che il tuo file xcdatamodeld sia stato aggiunto qui. 

enter image description here

Nessuna delle soluzioni pubblicate ha funzionato per me. Quindi, spero che questo post aiuti qualcuno là fuori. La mia app si arresta solo in versione build btw. Lezione imparata. Verifica sempre le build di rilascio! 

A proposito, ho trovato questo SO post il più utile https://stackoverflow.com/a/6708837/951349 .

6
smileBot

ho avuto lo stesso problema con @Dominic Williams

prova a cambiare il nome del file momd in basso (puoi trovarlo nel metodo managedObjectModel in default), che è lo stesso del file [file name].xcdatamodeld che hai creato:

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"[same with name of xcdatamodeld]" withExtension:@"momd"];
6
rock

Ho avuto lo stesso problema. La soluzione era un mix di 2 risposte:

1) Ho dovuto aggiungere il parametro "sottodirectory" alla chiamata URLForResource

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"DATAMODEL_NAME" withExtension:@"mom" subdirectory:@"DATAMODEL_NAME.momd"];

2) Per una ragione che non conosco, il modello di dati non è stato incluso quando il progetto è stato compilato. Ho dovuto aggiungerlo manualmente alle "Build Fasi/Compile resources".

Con solo una delle soluzioni di cui sopra, la mia applicazione non ha funzionato.

5

La soluzione al problema di cui parli è semplice. Cambia l'estensione del file in "mamma" invece di "momd" nell'URL del modello. Fatto.

4
pfuri

Risolvo il problema senza modificare alcun codice.

Aggiungo ModelName.xcdatamodeld tramite File-> Aggiungi file invece di trascinare il file in Xcode.

 NSString *[email protected]"ModelName";

NSURL *modelURL = [NSURL fileURLWithPath:[path stringByAppendingPathExtension:@"momd"]];

model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
4
Chris So

Ho provato tutte le soluzioni qui e nessuno di loro ha funzionato. Il mio problema è apparso dopo aver rinominato il progetto. Apparentemente, Xcode continua a cercare il vecchio file momd nel posto sbagliato durante la compilazione. 

Per chiunque abbia provato tutte le soluzioni di cui sopra senza successo, prova a controllare il percorso completo del tuo file .xcdatamodeld. Questo è quello che ha funzionato per me. 

4
XCool

Ho avuto lo stesso problema, ha funzionato bene su iOS6 ma non su iOS5 . Ecco come ho risolto:

  1. Crea una nuova versione del modello in xcode. (seleziona .xcdatamodeld, apri il menu Editor e fai clic su "Aggiungi versione modello ...")
  2. Compilare e assicurarsi che la nuova versione funzioni.
  3. Imposta quello vecchio come versione corrente. ("Corrente" in File Inspector per .xcdatamodeld in Modello dati Core versione)
  4. Rimuovi il riferimento al file .xcdatamodeld in xcode
  5. Fai clic con il pulsante destro del mouse sul file .xcdatamodeld nel Finder e seleziona "Mostra contenuto pacchetto"
  6. Elimina il nuovo .xcdatamodel che non desideri
  7. Aggiungere nuovamente .xcdatamodeld in xcode
  8. Compilare e sorridere

(Qui è dove ho trovato come eliminare una versione del modello: Come eliminare una versione del modello di dati vecchia/inutilizzata in Xcode )

4
fredrik

Se qualcuno è bloccato a causa dello stesso problema. Assicurati di aver collegato correttamente il database (dato che potresti aver copiato il codice direttamente da qualche esempio) .
Basta aggiornare il nome del database in managedObjectModel e persistentStoreCoordinator metodi in AppDelegate.

1
nomann

Ho avuto questo problema dal nulla dopo aver eliminato l'app generata nel ~/Library/Application Support/iPhone Simulator. In qualche modo questo ha causato il fallimento di build successive nel simulatore e sui dispositivi. Non avevo cambiato nulla a che fare con CoreData per anni ma sarebbe fallito con il Cannot create an NSPersistentStoreCoordinator with a nil model. Ho provato alcune cose sopra e niente ha funzionato.

Potrei vedere la cartella momd generata con il file mamma dentro. L'app nel simulatore poteva vedere entrambi, ma non è riuscito a generare il file sqlite.

Ciò che ha risolto è stato l'aggiunta di un attributo a un'entità nel mio file xcdatamodeld in Xcode e quindi l'eliminazione immediata. Speravo che questo avrebbe portato Xcode a rigenerare qualsiasi cosa causasse il problema da zero e sembrava funzionare. Non è ancora chiaro cosa c'è di sbagliato, ma la mia app è di nuovo in esecuzione nel simulatore e nei dispositivi.

1

So che questo non risolve il tuo problema ma mi sono imbattuto in questo problema ieri che mi ha tormentato per ore, la soluzione che @Dominic Williams ha pubblicato mi ha dato una ArrayIndexOutOfBoundsException (qualunque sia l'equivalente Objective-C).

Non sono ancora molto bravo con Objective-C/Xcode, ma sto lavorando a un'app per iOS che la nostra azienda ha (per lo più) sviluppato esternamente. Sfortunatamente, spesso dimenticavano come usare una tastiera e usavano le lettere maiuscole in modo intercambiabile o le proprietà degli incantesimi in modo errato, ma erano troppo pigre per tornare indietro e cambiarle. Avevano usato una lettera maiuscola nel nome del progetto xcode dove non doveva essere (il nome del nostro prodotto non utilizzava maiuscole) e dovevo tornare indietro e cambiare ogni occorrenza di questa lettera maiuscola in una minuscola ; che includeva il nome del progetto, il file di dati di base, centinaia di variabili, ecc.

Ad ogni modo, una volta fatto ciò, mi sono imbattuto in questo errore e nessuna soluzione l'ha risolto. Mi ero assicurato che tutti i nomi degli URL fossero corretti, pulito il progetto, disinstallato l'app, riavviato il telefono, ecc. Senza risultati. Mi sono arreso e ho spento il mio Mac e sono andato a casa per la giornata. Con mia sorpresa, sono tornato questa mattina e tutto sembrava funzionare bene!

Non ho idea del motivo per cui questo ha funzionato, ma se sei bloccato, prova a riavviare il tuo Mac.

1

Ho cercato una risposta per ore e niente ha funzionato. Ma poi improvvisamente ho trovato questo article . Quindi, secondo questo, il problema era nell'impostare il controller di root in questa parte di AppDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    ListViewController *rootView = (ListViewController *)self.window.rootViewController;
    rootView.managedObjectContext = self.managedObjectContext;
    return YES;
}

In effetti dovresti definire quale controller di root delegherà la tua connessione CoreData. E nel mio caso ho avuto un TabBarController connesso ad altre viste, quindi il mio controller di root di visualizzazione targato è stato definito come TabBar e ha causato un errore. Ho cambiato

ListViewController *rootView = (ListViewController *)self.window.rootViewController;

a

ListViewController *rootView = (ListViewController *)self.window.superview;

e tutto ha funzionato.

1
kokoko

Ho avuto lo stesso problema, ad es. 

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyModel" withExtension:@"momd"];

restituito nil, perché non è stato generato alcun file .momd.

Il motivo era che nella directory dell'app (ad es. MyGreatApp/MyGreatApp.app) xcode aveva copiato MyModel.xcdatamodeld invece di generare MyModel.momd dal file MyModel.xcdatamodeld (usando momc).

La soluzione era eliminare il riferimento a MyModel.xcdatamodeld all'interno del browser del progetto XCode e trascinarlo nel progetto dal Finder. Dopo che xcode si rese conto che aveva bisogno di compilarlo su un .momd.

Da parte mia il problema era che avevo cambiato il caso di un paio di caratteri nel nome del database.

Quando si avvia un nuovo progetto, Xcode imposta automaticamente tutto dal nome del progetto. Se hai iniziato a chiamare il tuo progetto "Rugbyontv" e in seguito hai deciso di passare a "RugbyOnTV" e hai fatto una ricerca e la sostituzione, questo l'avrebbe interrotta. (Credito a Rob per aver sottolineato che il nome è sensibile al maiuscolo/minuscolo)

1
Brian Gerfort

Se il tuo progetto funziona sul simulatore ma non sul dispositivo, prova a eseguire il rilascio-build sul tuo dispositivo invece del debug-build.

Seleziona il tuo progetto -> Prodotto -> Modifica schema -> Crea configurazione [DEBUG -> RELEASE]

Ora esegui di nuovo il progetto, funzionerà.

0
stackr

Ho appena avuto un problema simile l'aggiornamento da IOS5 a IOS6. Risulta che si trattava di un caso sensibile al problema con il nome del modello. 

Non sono sicuro se questo aiuti qualcuno. 

0
Troy

Vedi anche questo thread: Unit Test non trova il file del modello Core Data

Mi ha aiutato a risolvere il problema, che si era verificato solo con il test unitario

0
Thorsten Niehues

Per me il problema era dovuto al fatto che copio il mio modello passato da un progetto sandbox al mio progetto attuale. Assicurati sempre di generare il tuo modello all'interno del progetto in cui viene utilizzato il modello. 

0
FujiRoyale

Sto anche affrontando questo problema ma quando cambio il file ModelName.xcdatamodeld sta funzionando. quindi penso che il file ModelName.xcdatamodeld non sia stato aggiunto correttamente, quindi una volta controllato e pulito l'app ed eseguilo.

0
Nadella Ravindra

Ho affrontato questo stesso errore quando ho rinominato il file .xcdatamodel da xcode e ho cambiato il nome rinominato nel delegato dell'app ovunque fosse necessario, ma ho ancora lo stesso errore. Nessuna delle procedure suggerite ha funzionato per me.

Quindi ho aperto la cartella in Finder e ho trovato un file aggiuntivo .xccurrentversion insieme al file .xcdatamodel. L'ho aperto in TextEdit app e ho cambiato questo:

<dict>
    <key>_XCCurrentVersionName</key>
    <string>Your_Renamed_Model_FileName.xcdatamodel</string>
</dict>

Sto usando questo con Xcode 6.4, OSX Yosemite 10.10.1

Spero possa essere d'aiuto!

0
NeverHopeless

Dopo aver risolto il problema di denominazione, l'errore rimaneva. Quindi ha funzionato dopo aver riavviato Xcode 5. Ciò potrebbe fare automaticamente la stessa cosa di alcuni dei suggerimenti di collegamento manuali offerti qui.

0
EthanP

Va bene, prima dirò una mezza soluzione, funzionerà se reinstallerai l'app (nel simulatore o nel dispositivo debugger). Ma non è certo una soluzione reale. Ad esempio, se stai aggiornando la tua applicazione, NON farlo o la tua nuova versione potrebbe bloccarsi perché gli utenti non la reinstalleranno, useranno invece il pulsante di aggiornamento. 

Come ho capito, questo problema si verifica principalmente quando si modifica il nome del file del modello di dati. La ragione potrebbe essere così:
. Quando si esegue l'app per la prima volta, viene creato un file di modello di dati nel pacchetto di app come "data_model_1". Questa creazione avviene solo per la prima volta.
. Quando aggiorni il nome del file ed esegui di nuovo l'app, non sarà in grado di trovare perché c'è ancora il file "data_model_1" ma stai dicendo di cercare "data_model_2". Come può trovare, non l'ha ancora creato e non lo farà a meno che non si installa l'applicazione con il nuovo nome del file. 

Quindi, se questa è la prima versione della tua app e la re-installazione su simulatore o dispositivo non danneggia il tuo progetto, fallo. Altrimenti, controllare Guida al trasferimento di versioni e dei dati del modello di dati di base su iOS Developer Library, forse è quello che ti serve. 

Modifica: se la reinstallazione non funziona, provare prima a disinstallare, quindi a pulire il progetto, quindi chiudere tutto, riaprire progetto e compilare + eseguire. Questo dovrebbe funzionare.

0
kubilay