96 votes

Impossible de créer un NSPersistentStoreCoordinator avec un modèle nil

Été faire ma première fissure à la Base de Données et j'obtiens l'erreur suivante lors de l'exécution de mon code sur mon appareil, mais il fonctionne très bien sur le simulateur..

* Résiliation d'application en raison de uncaught exception 'NSInvalidArgumentException', la raison: "Impossible de créer un NSPersistentStoreCoordinator avec un nul" modèle

Certains de mes méthodes qui pourraient être à l'origine du problème:

    - (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;
    }

MODIFIER

J'ai copié et collé le managedObjectContext méthode (ci-dessous) à partir d'Apple CoreDataBooks et il fonctionne maintenant..Pas vraiment sûr de savoir pourquoi si

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

156voto

Gareth Lloyd Points 1296

J'ai eu exactement le même message d'erreur que le post original. J'ai été aux prises avec cela pendant des heures. C'est cette ligne dans mon AppDelegate.m.

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

Pour tous ceux à la recherche de ce message d'erreur et de trouver ce fil....essayez dans un premier temps.

Vous devez vous assurer que là où il est dit [de même avec le nom de xcdatamodeld]....que c'est!!! Pour une raison quelconque, la mine a eu mon projet nom là-bas et pas le modèle de données nom.

Changé et cela a fonctionné tout de suite.....

Merci à Rock & Muller pour contribuer.......vous m'avez sauvé jours!!

Gaz.

54voto

D33pN16h7 Points 1393

d'abord vérifier:

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

Si vous obtenez une valeur nulle, le problème est peut-être là

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

Alors, essayez de changer @ "momd" par @ "mom"

20voto

xster Points 1254

J'ai vécu un drôle de problème avec Xcode 4.3.2 et iOS 5.

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

renvoie une URL valide, mais

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

renvoie une valeur null NSManagedObjectModel. Mais après vérification de la documentation, il semble que NSManagedObjectModel besoin d'un fichier où, comme NAME_OF_THE_MODEL.momd est un répertoire qui contient un NAME_OF_THE_MODEL.maman de fichier. Modification de l'URL d'

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

puis il travaille. Bizarre bien que Xcode génère du code qui ne fonctionne pas avec lui-même...

19voto

JDx Points 1289

J'ai eu ce problème et changer "maman" en "maman" n'a rien fait. Pour résoudre ce problème, je devais cliquer avec le bouton droit de la souris sur le fichier xcdatamodelId> afficher le contenu du paquet, puis supprimer le fichier caché .xcurrentversion.

PS: Ce problème ne s'est produit qu'après que j'ai modifié le nom du fichier de modèle de données.

13voto

Dave Wood Points 2641

Une autre source de cette erreur est que, parfois, Xcode n'inclut pas le modèle de données dans la construction.

Vérifiez les phases de construction de votre cible et assurez-vous que le fichier * .xcdatamodeld est inclus dans la section Compiler les sources.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X