“无法加载 NSManagedObjectModel。nil 是非法的 URL 参数”

Posted

技术标签:

【中文标题】“无法加载 NSManagedObjectModel。nil 是非法的 URL 参数”【英文标题】:"Cannot load NSManagedObjectModel. nil is an illegal URL parameter" 【发布时间】:2015-10-06 10:14:22 【问题描述】:

我想从 AppDelegate 获取托管对象上下文,但是我将两行代码放入方法中后应用程序崩溃了,即使我没有做任何其他事情,并且在调试区域中有一条消息:“CoreData:无法加载 NSManagedObjectModel。nil 是非法的 URL 参数..."

我的方法中添加的代码:

AppDelegate *delegate = [UIApplication sharedApplication].delegate;
NSManagedObjectContext *managedObjectContext = delegate.managedObjectContext;

-AppDelegate 中的managedObjectModel 方法:

- (NSManagedObjectModel *)managedObjectModel 
// The managed object model for the application. It is a fatal error for the application not to be able to find and load its model.
if (_managedObjectModel != nil) 
    return _managedObjectModel;

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"FoodPin" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _managedObjectModel;

和 -managedObjectContext 方法:

- (NSManagedObjectContext *)managedObjectContext 
// Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.)
if (_managedObjectContext != nil) 
    return _managedObjectContext;


NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (!coordinator) 
    return nil;

_managedObjectContext = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
return _managedObjectContext;

“FoodPin”是我的项目名称。那么这里出了什么问题?我是 iPhone 编程的新手(尤其是 Core Data)。

谁能帮帮我?

谢谢...

【问题讨论】:

问题是 [[NSBundle mainBundle] URLForResource:@"FoodPin" withExtension:@"momd"]; 将 nil 返回到 modelURL。您的项目中是否有一个名为 FoodPin 的核心数据模型? 哦..非常感谢,我忘记更改 .xcdatamodeld 文件的名称了! 【参考方案1】:

问题出在这一行:

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

modelURLnil,表示系统找不到资源FoodPin.momd

确保您的项目中有一个名为 FoodPin 的 Core Data 模型。它将在项目导航器中显示为FoodPin.xcdatamodeld

【讨论】:

注意:即使文件以扩展名xcdatamodeld 出现,该方法仍应寻找扩展名momd(正如在此答案中的代码中一样)。 即使我的项目中有同名文件,我也得到同样的错误。 @CnchalRaj 到目前为止有什么解决方案吗?【参考方案2】:

我遇到了同样的问题,但对我来说,modelURL 设置正确。问题是我的 *.xcdatamodeld 文件不再位于 Copy bundle 资源中。我不知道为什么它会消失,但再次添加它可以解决问题。

以下是解决方法: 您的项目 > Build Phases > Copy Bundle ressources > “+”按钮并选择您的 xcdatamodeld 文件

【讨论】:

这解决了我的问题。我不知道发生了什么。查看我的提交历史,*. xcdatamodeld 从未处于 Copy Bundle Resources 构建阶段。我正在使用 Xcode 8 beta 6。 我删除了 *. xcdatamodeld 从复制捆绑资源构建阶段,问题仍然解决。可能是 Xcode 的缓存问题,这意味着执行 Clean 或 Clean Build Folder 可能会为其他人解决此问题。【参考方案3】:

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

确保您的数据模型名称与 URLForResource:XYZ 匹配。

【讨论】:

【参考方案4】:

好的,这就是我必须做的。我已将 ios 版本恢复到 9.x,以便在我拥有的旧 iPad 上运行。这会导致错误,因为以前的版本在捆绑包中必须区分大小写。

【讨论】:

【参考方案5】:

尝试“妈妈”而不是“妈妈”

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"name" withExtension:@"mom"];

【讨论】:

您的建议解决了我的问题。谢谢。【参考方案6】:

我有同样的错误。

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

名称中的“n”必须是“N”:就像 obj c 中的其他所有内容一样,这个母亲是区分大小写的。

【讨论】:

以上是关于“无法加载 NSManagedObjectModel。nil 是非法的 URL 参数”的主要内容,如果未能解决你的问题,请参考以下文章