2010-07-10 8 views
8

Nur versuchen, in die Core Data-Sachen zu bekommen und auf Anhieb gekreuzt zu werden. In meinem AppDelegate habe ich den folgenden Code:- [NSURL initFileURLWithPath:]: kein String-Parameter 'auf 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_; 
} 

Wo @ "Datamodel" ist der Name meiner .xcdatamodel Datei - stimmt das?

+5

Sind Sie sicher, dass Ihr Modell vom Typ mom und nicht von Mama ist? (versioniertes vs. nicht versioniertes Modell) –

Antwort

8

Es ist oft einfacher, diese

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

Dann

zu ändern, wenn es sich um eine Mutter ist oder momd Sie noch zurück, das Modell bekommen.

+0

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

12

Das Ändern von "momd" zu "mom" funktionierte für mich. Marcus S. Zarra Antwort arbeitete auch für mich, wenn ich die Syntax festgelegt:

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

obwohl ich keine Ahnung, was diese Zeile tut.

Edit: Ich habe etwas mehr Forschung und ich weiß jetzt, was die obige Zeile und warum es funktioniert/nicht funktioniert. Die obige Zeile durchsucht Ihr Projekt nach allen Modellen und fügt sie dem xcdatamodel hinzu. Dies funktioniert, wenn Sie keine versionierten Modelle verwenden. Wenn Sie jedoch in der Zukunft versionierte Modelle verwenden, wird dies alle Versionen des Modells importieren, so dass Sie sowohl das alte als auch das neue zusammen erhalten, was NICHT das ist, was Sie wollen. Also ist die Lösung, eines von zwei Dingen zu tun. Wenn Sie ein nicht-versioniert Modell verwenden Sie die folgenden Zeilen verwenden möchten, um das Modell zu greifen:

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

Wenn Sie ein versioniert Modell (empfohlen) verwenden möchten, wählen Sie das Modell und führen Sie Design -> Datenmodell -> Add Model Version aus der Menüleiste, um ein versioniertes Modell zu erstellen. Dadurch wird automatisch die Erweiterung Ihres Modells von xcdatamodel in xcdatamodel geändert. Sobald dies geschehen ist, um die folgenden Zeilen verwenden:

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

Beachten Sie, dass der einzige Unterschied besteht darin, die ofType Parameteränderungen von @ „mom“ auf @ „momd“. Ich hoffe, dass dies verdeutlicht, was für jeden vorgeht, der CoreData.D zu verstehen versucht.