无法使用nil模型创建NSPersistentStoreCoordinator

Dom*_*ams 95 core-data objective-c ios

我在Core Data上遇到了我的第一个破解,当我在我的设备上运行代码时出现以下错误,但它在模拟器上工作正常.

*由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:'无法使用nil模型创建NSPersistentStoreCoordinator'

我的一些方法可能导致问题:

    - (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;
    }
Run Code Online (Sandbox Code Playgroud)

编辑

我从Apple的CoreDataBooks复制并粘贴了managedObjectContext方法(下面),它现在可以工作了......虽然不知道为什么

- (NSManagedObjectModel *)managedObjectModel {
    if (managedObjectModel != nil) {
        return managedObjectModel;
    }
    managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];    
    return managedObjectModel;
}
Run Code Online (Sandbox Code Playgroud)

小智 157

我有与原始帖子完全相同的错误消息.几个小时我一直在摔跤.这是AppDelegate.m中的这一行.

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"[same with name of xcdatamodeld]" withExtension:@"momd"];
Run Code Online (Sandbox Code Playgroud)

对于任何人在那里搜索此错误消息并找到此线程....首先尝试这个.

你必须确保它所在的位置[与xcdatamodeld的名称相同] ....它是!!! 由于某种原因,我的项目名称在那里,而不是数据模型名称.

改变它,它立即工作.....

感谢Rock&Muller的贡献.......你救了我几天!

暖气.

  • 这是让它适合我的评论.我的应用程序正在寻找的神奇名字是来自`blah.xcdatamodeld`的`blah`.谢谢你的互联网和stackoverflow. (2认同)

D33*_*6h7 54

首先验证:

NSLog(@"%@", [self managedObjectModel]);
Run Code Online (Sandbox Code Playgroud)

如果你得到一个零值可能问题就在这里

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"RugbyOnTv" withExtension:@"momd"];
Run Code Online (Sandbox Code Playgroud)

所以,尝试用@"妈妈"改变@"momd"

  • 最近推出了我的模型的第二个版本,我不得不将它改回妈妈.鉴于模型版本容器具有xdatamodeld的扩展,我认为我们可以推断出这里发生了什么."momd"适用于具有多个版本的模型,而"mom"适用于没有版本控制的模型. (10认同)
  • 很可能`modelURL`也是'nil`.最常见的原因是`RugbyOnTv`中的拼写错误.请注意,这是区分大小写的. (3认同)
  • 我将代码复制到一个新项目[iOS7]中,并且最初是妈妈,但是改为妈妈修复了它.我不知道如果没有这个我怎么会找到解决方案,所以谢谢:) (2认同)

xst*_*ter 20

我遇到过Xcode 4.3.2和iOS 5的奇怪问题.

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"NAME_OF_THE_MODEL" withExtension:@"momd"];
Run Code Online (Sandbox Code Playgroud)

返回有效的URL但是

__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
Run Code Online (Sandbox Code Playgroud)

返回null NSManagedObjectModel.但在检查文档后,似乎NSManagedObjectModel需要一个文件,其中NAME_OF_THE_MODEL.momd是一个包含NAME_OF_THE_MODEL.mom文件的目录.将URL更改为

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"NAME_OF_THE_MODEL" withExtension:@"mom" subdirectory:@"NAME_OF_THE_MODEL.momd"];
Run Code Online (Sandbox Code Playgroud)

然后工作.虽然Xcode生成的代码不能与自身一起工作,但似乎很奇怪......


JDx*_*JDx 19

我有这个问题,将"妈妈"改为"妈妈"没有做任何事.要修复它,我必须右键单击xcdatamodelId文件>显示包内容,然后删除隐藏的.xcurrentversion文件.

PS:这个问题才在我更改了数据模型文件的名称后才开始发生.

  • 对于遇到以下问题的每个人:重命名xcdatamodeld文件后,managedObjectModel为nil:这个答案是最好的!谢谢JDx,你的回答对我帮助很大! (2认同)

Dav*_*ood 13

此错误的另一个原因是,有时Xcode不包含构建中的数据模型.

检查目标的Build Phases,并确保*.xcdatamodeld文件包含在Compile Sources部分中.


Lou*_*men 9

可能发生的是,Apple的源代码中的xcdatamodeld文件已变为xcdatamodel(没有d)文件,因此它们不被认为是相同的.

解决此问题的最快方法是在项目导航器中选择xcdatamodel文件并进入菜单栏

Editor->Add Model Version...

并添加模型的新版本.对新版本进行所有更改.

这适用于Xcode 5


roc*_*ock 6

我和@Dominic Williams有同样的问题

尝试更改下面的momd文件名(managedObjectModel默认情况下可以在方法中找到),与[file name].xcdatamodeld您创建的文件相同:

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"[same with name of xcdatamodeld]" withExtension:@"momd"];
Run Code Online (Sandbox Code Playgroud)


smi*_*Bot 6

我通过添加db文件来解决它Copy Bundle Resources.

转到项目的根目录>>选择目标>>构建阶段>>复制捆绑资源.确保您的xcdatamodeld文件已添加到此处.

在此输入图像描述

所有发布的解决方案都不适合我.所以,希望这篇文章可以帮助那些人.我的应用程序只在发布版本btw崩溃.学过的知识.始终测试发布版本!

顺便说一句,我发现这个SO帖子最有帮助/sf/answers/469618621/.


小智 5

我有同样的问题.解决方案是2个答案的组合:

1)我必须将"subdirectory"参数添加到URLForResource调用中

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"DATAMODEL_NAME" withExtension:@"mom" subdirectory:@"DATAMODEL_NAME.momd"];
Run Code Online (Sandbox Code Playgroud)

2)由于我不知道的原因,在编译项目时不包括数据模型.我不得不手动将其添加到"构建阶段/编译资源"中.

只有上述解决方案之一,我的应用程序无法正常工作.