“无法加载 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"];
modelURL
是nil
,表示系统找不到资源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 参数”的主要内容,如果未能解决你的问题,请参考以下文章