无法使用nil模型创buildNSPersistentStoreCoordinator
一直在我的第一次在核心数据的裂缝,我在我的设备上运行我的代码时得到以下错误,但它在模拟器上正常工作..
*终止应用程序,由于未捕获exception“NSInvalidArgumentException”,原因:'无法创build一个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; }
编辑
我从Apple的CoreDataBooks复制和粘贴managedObjectContext方法(下面),它现在工作..不知道为什么虽然
- (NSManagedObjectModel *)managedObjectModel { if (managedObjectModel != nil) { return managedObjectModel; } managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; return managedObjectModel; }
我和原来的post有完全一样的错误信息。 我摔了几个小时。 这是我的AppDelegate.m这行。
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"[same with name of xcdatamodeld]" withExtension:@"momd"];
对于任何人在那里search这个错误消息,并find这个线程….先试试这个。
你必须确保它说的地方[与xcdatamodeld的名字相同] ….它是! 出于某种原因,我的项目名称在那里,而不是数据模型名称。
改变它,它直接工作…..
感谢Rock&Muller的贡献…….你救了我几天!
暖气。
首先validation:
NSLog(@"%@", [self managedObjectModel]);
如果你得到一个零值也许问题在这里
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"RugbyOnTv" withExtension:@"momd"];
所以,试着用@“mom”来改变@“momd”
我遇到了Xcode 4.3.2和iOS 5的一个奇怪的问题。
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"NAME_OF_THE_MODEL" withExtension:@"momd"];
返回一个有效的url
__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
返回一个空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"];
然后工作。 看起来很奇怪,尽pipeXcode生成的代码不能与自己一起工作…
我有这个问题,把“妈妈”改成“妈妈”没有做任何事情。 要解决它,我必须右键单击xcdatamodelId文件>显示包内容,然后删除隐藏的.xcurrentversion文件。
PS:这个问题只是在我改变了数据模型文件的名字后才开始发生。
这个错误的另一个来源是,有时Xcode不包含构build中的数据模型。
检查目标的构build阶段,并确保* .xcdatamodeld文件包含在“编译源”部分。
可能发生的情况是,你的来自苹果源代码的xcdatamodeld文件已经变成了xcdatamodel(没有d)文件,因此它们被认为是不相同的。
解决这个问题最快捷的方法是在项目导航器中selectxcdatamodel文件并进入菜单栏
Editor->Add Model Version...
并添加您的模型的新版本。 对新版本进行所有更改。
这在Xcode 5中工作
我和@Dominic Williams有同样的问题
尝试更改下面的momd文件名(您可以在默认情况下在managedObjectModel
方法中find此名称),它与您创build的[file name].xcdatamodeld
文件相同:
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"[same with name of xcdatamodeld]" withExtension:@"momd"];
我通过将数据库文件添加到Copy Bundle Resources
解决它。
转到您的项目的根目录>>select您的目标>>构build阶段>>复制包资源。 确保您的xcdatamodeld文件已添加到此处。
没有发布的解决scheme为我工作。 所以,希望这个post可以帮助那里的人。 我的应用程序只崩溃在发布构build顺便说一句。 学过的知识。 始终testing版本构build!
顺便说一句,我发现这个SO发布最有用的https://stackoverflow.com/a/6708837/951349 。
我有同样的问题。 解决scheme是2个答案的组合:
1)我不得不将“子目录”参数添加到URLForResource调用
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"DATAMODEL_NAME" withExtension:@"mom" subdirectory:@"DATAMODEL_NAME.momd"];
2)由于我不知道的原因,编译项目时数据模型不包括在内。 我不得不手动添加到“构build阶段/编译资源”。
只有上述解决scheme之一,我的应用程序不起作用。
你所说的问题的解决办法很简单。 在模型URL中将文件扩展名更改为“mom”而不是“momd”。 完成。
我在这里尝试了所有的解决scheme,没有一个工作。 我重新命名项目后出现了我的问题。 显然,Xcode在编译期间继续在错误的地方查找旧的momd文件。
对于任何尝试所有上述解决scheme而未能成功的人,请尝试检查.xcdatamodeld
文件的完整path。 这对我来说是有用的。
我有同样的问题,它在iOS6上工作正常,但不是在iOS5上。 这是我解决它的方法:
- 在xcode中创build一个新的Model版本。 (select
.xcdatamodeld
,打开编辑器菜单并点击“添加模型版本…”) - 编译并确保新版本的工作。
- 将旧版本设置为当前版本。 (Versioned核心数据模型下
.xcdatamodeld
File Inspector中的“Current”) - 删除对xcode中
.xcdatamodeld
文件的引用 - 右键单击Finder中的
.xcdatamodeld
文件,然后select“Show Package Contents” - 删除你不想要的新的
.xcdatamodel
- 在xcode中重新添加
.xcdatamodeld
- 编译和微笑
(这是我发现如何删除模型版本: 如何删除Xcode中旧的/未使用的数据模型版本 )
我解决了这个问题,而不用改变任何代码
我通过File-> Add File来添加ModelName.xcdatamodeld,而不是将文件拖到Xcode中。
NSString *path=@"ModelName"; NSURL *modelURL = [NSURL fileURLWithPath:[path stringByAppendingPathExtension:@"momd"]]; model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
在我这边,问题是我改变了数据库名称中的几个字符的情况。
当开始一个新项目时,Xcode会自动设置项目名称。 如果你开始打电话给你的项目“Rugbyontv”,后来决定改成“RugbyOnTV”并做了一个search和replace,那就打破了它。 (感谢Rob指出这个名字是区分大小写的)
我一直在寻找一个小时的答案,没有任何工作。 但后来我突然发现这篇文章 。 所以根据这个,问题是在AppDelegate.m的这个部分设置根控制器:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions ListViewController *rootView = (ListViewController *)self.window.rootViewController; rootView.managedObjectContext = self.managedObjectContext; return YES; }
事实上,你应该定义什么根控制器将委派你的CoreData连接。 在我的情况下,我有一个TabBarController连接到其他视图,所以我的目录视图根控制器被定义为TabBar,并导致一个错误。 我变了
ListViewController *rootView = (ListViewController *)self.window.rootViewController;
至
ListViewController *rootView = (ListViewController *)self.window.superview;
和一切工作。
我知道这不能解决你的问题,但我昨天碰到这个问题困扰了我几个小时,解决scheme@Dominic Williams张贴给了我一个ArrayIndexOutOfBoundsException(无论Objective-C的等价物)。
Objective-C / Xcode还不是很好,但是我正在开发一个我们公司的iOS应用程序(主要是)外部开发的。 不幸的是,他们经常会忘记如何使用键盘,并且会互换地使用大写字母,或者错误地拼写属性,但却懒得回头去改变它。 他们在xcode项目名称中使用了一个大写字母(我们的产品名称不使用大写字母),我不得不返回,将这个大写字母的每个出现都改为小写; 其中包括项目名称,核心数据文件,数百个variables等
无论如何,一旦我这样做了,我遇到了这个错误,没有解决scheme是为我修复它。 我已经确保所有的URL名称是正确的,项目清理,应用程序卸载,手机重新启动等无济于事。 我放弃了, 关掉了我的Mac ,回家过一天。 令我惊讶的是,今天早上我回来了,一切似乎都很好!
我不知道为什么这个工作,但如果你卡住,请尝试重新启动您的Mac。
如果有人由于同样的问题而卡住了。 确保你有正确的链接数据库(因为你可能直接从一些例子复制代码)。
只需更新AppDelegate中managedObjectModel和persistentStoreCoordinator方法中的数据库名称即可。
我有同样的问题,即
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyModel" withExtension:@"momd"];
返回零,因为没有生成.momd文件。
原因是在应用程序目录(例如MyGreatApp / MyGreatApp.app)xcode已经复制MyModel.xcdatamodeld而不是从MyModel.xcdatamodeld文件(使用momc)生成MyModel.momd。
解决方法是在XCode项目浏览器中删除对MyModel.xcdatamodeld的引用,并将其从查找程序中拖回到项目中。 之后,xcode意识到需要将其编译为.momd。
我在~/Library/Application Support/iPhone Simulator
删除了生成的应用程序后,出现了这个问题。 不知何故,这导致后续的版本在模拟器和设备上失败。 没有改变任何与CoreData做的年龄,但它会失败, Cannot create an NSPersistentStoreCoordinator with a nil model
。 尝试了上面的几件事,没有任何工作。
我可以看到里面的妈妈文件生成的妈妈文件夹。 在模拟器中的应用程序可以看到两者,但没有生成sqlite文件。
解决的办法是在Xcode的xcdatamodeld文件中为实体添加一个属性,然后立即删除它。 我希望这将使Xcode重新生成任何从头开始的问题,它似乎工作。 仍然不清楚究竟是什么错误,但我的应用程序现在再次运行在模拟器和设备上。
我刚刚从IOS5升级到IOS6类似的问题。 原来,这是一个模型名称的大小写敏感的问题。
不知道这是否有助于任何人。
另请参阅此线程: unit testing无法find核心数据模型文件
它帮助我解决了这个问题 – 这只发生在unit testing中
好吧,我会先告诉你一个半解决scheme,如果你重新安装应用程序(在模拟器或debugging器设备),它将工作。 但是这不是一个真正的解决scheme。 例如,如果您正在更新您的应用程序,不要这样做,否则您的新版本可能会崩溃,因为用户不会重新安装它,他们将使用更新button。
据我所知,这个问题主要发生在您更改数据模型文件名时。 原因可能是这样的:
。 当您第一次运行应用程序时,它将在应用程序包中创build一个数据模型文件,如“data_model_1”。 这种创造只发生在第一次。
。 当您更新文件名并再次运行应用程序时,将无法find,因为仍然存在“data_model_1”文件,但是您要求它查找“data_model_2”。 它怎么能find,它还没有创build它,除非你不用新的文件名安装应用程序。
所以,如果这是您的应用程序的第一个版本,并在模拟器或设备上重新安装不会损害您的项目,那就去做吧。 否则,请查看iOS开发者库的核心数据模型版本控制和数据迁移指南 ,也许是您需要的。
编辑:如果重新安装不起作用,请先尝试卸载,然后清理项目,然后closures所有内容,重新打开项目并编译+运行。 这应该工作。
如果您的项目在模拟器上,但不在设备上,请尝试在您的设备上运行release-build而不是debug-build。
select你的项目 – >产品 – >编辑scheme – >生成configuration[DEBUG – > RELEASE]
现在再次运行该项目,它将工作。
我也面临这个问题,但是当我更改ModelName.xcdatamodeld
文件它正在工作。 所以我认为ModelName.xcdatamodeld
文件没有正确添加,所以一旦检查并清理应用程序并运行它。
在解决了命名问题后,错误仍然存在。 然后它重新启动Xcode 5后,它可以自动做一些手动链接build议在这里提供的一样。
对我来说,问题是由于我复制粘贴我的模型从沙箱项目到我的实际项目。 始终确保从正在使用模型的项目中生成模型。
当我重命名 xcode中的.xcdatamodel
文件并在应用程序委托中更改了重命名的名称时,我遇到了同样的错误,但是我仍然遇到同样的错误。 没有build议的程序为我工作。
然后,我在Finder
打开文件夹,并find一个附加文件.xccurrentversion
和.xcdatamodel
文件。 我在TextEdit
应用程序中打开它并更改了这个:
<dict> <key>_XCCurrentVersionName</key> <string>Your_Renamed_Model_FileName.xcdatamodel</string> </dict>
我使用Xcode 6.4,OSX Yosemite 10.10.1
我希望它有帮助!