2010-07-10 13 views
8

Solo cercando di entrare nella roba dei dati di base e di passare inosservati. Nel mio AppDelegate ho il seguente codice:- [NSURL initFileURLWithPath:]: parametro stringa nil 'su NSManagedObjectModel

- (NSManagedObjectModel *)managedObjectModel { 

    if (managedObjectModel_ != nil) { 
     return managedObjectModel_; 
    } 
    NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"DataModel" ofType:@"momd"]; 
    NSURL *modelURL = [NSURL fileURLWithPath:modelPath]; 
    managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];  
    return managedObjectModel_; 
} 

Dove @ "DataModel" è il nome del mio file .xcdatamodel - è corretto?

+5

sei sicuro il vostro modello è di tipo momd e non mamma? (Con versione vs. modello unversioned) –

risposta

8

Spesso è più facile cambiare questo per

managedObjectModel_ = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; 

Poi, se si tratta di una mamma o momd si continua a ottenere il modello indietro.

+0

managedObjectModel_ = [[NSManagedObjectModel mergedModelFromBundles: nil] trattenere]; –

12

Cambiare "mamma" in "mamma" ha funzionato per me. La risposta di Marcus S. Zarra ha lavorato anche per me una volta ho fissato la sintassi per:

managedObjectModel_ = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; 

anche se non ho idea di che cosa fa quella linea.

Edit: ho fatto un po 'di ricerca e ora so quello che la linea di cui sopra fa e perché funziona/non funziona. la linea sopra cercherà il tuo progetto per tutti i modelli e li aggiungerà a xcdatamodel. Funziona se non si utilizzano modelli con versione. Tuttavia, se si decide di utilizzare gli modelli con versione in futuro questo importerà tutte le versioni del modello in modo da ottenere sia il vecchio e il nuovo insieme che non è ciò che si desidera. Quindi la soluzione è fare una delle due cose. Se si desidera utilizzare un modello non di versione utilizzare le seguenti linee per afferrare il modello:

NSString *modelPath = [[NSBundle mainBundle] 
    pathForResource:@"DataModel" ofType:@"mom"]; 
NSURL *modelURL = [NSURL fileURLWithPath:modelPath]; 
managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 

Se si desidera utilizzare un modello di versione (consigliata) selezionare il modello ed eseguire Design -> Modello di dati -> Aggiungi Modello Versione dalla barra dei menu per creare un modello con versione. Questo cambierà automaticamente l'estensione del modello da xcdatamodel a xcdatamodeld. Una volta fatto questo utilizzare le seguenti linee:

NSString *modelPath = [[NSBundle mainBundle] 
    pathForResource:@"DataModel" ofType:@"momd"]; 
NSURL *modelURL = [NSURL fileURLWithPath:modelPath]; 
managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 

Si noti che l'unica differenza è il parametro cambia OfType da @ "mamma" a @ "momd". Spero che questo chiarisce ciò che sta succedendo per tutti coloro che sta cercando di capire CoreData.D

Problemi correlati