核心数据 – 无法加载path上的优化模型
我在我的控制台中使用iOS 9testing版5在我的iPhone 6中从Xcode 6运行我的应用程序时,
CoreData:无法在path加载优化模型'/var/mobile/Containers/Bundle/Application/0000000B-BDBC-0000-000B-0000FB00000B/Distribution.app/database.momd/database.omo'
我没有find与此有关的事情,有没有人有关于这个消息的线索?
我遇到了这个问题,并做了一些挖掘。
我一直在用Xcode 6.4构build,它看起来像以前的核心数据只在MyApp.ipa momd目录中生成一个.mom文件。 这个截图来自一个已经看过几个版本的Xcode的项目。
请注意,所有较旧的型号版本只有一个.mom文件。 我刚刚创build了一个新的模型版本,它有一个.mom和一个.omo文件。
看来,Xcode 6.4(也许还有一些beta 7.x版本)不知道如何加载数据模型的优化版本,因为我也得到
2015-10-16 11:11:42.563 MyAppName[1767:599635] CoreData: Failed to load optimized model at path '/var/mobile/Containers/Bundle/Application/D887D60B-FB28-4059-8167-F573460D98F8/MyAppName.app/MyDataModel.momd/MyDataModel3_0Analytics.omo'
与6.4编译时警告。 但是,当编译应用程序与最新的应用程序商店版本的Xcode(7.0.1),我没有得到这个警告。 我猜测Mahesh的解决scheme正在工作的原因是重写整个模式创build应用程序包中应用程序正在寻找的.omo文件。
我的解决scheme是在核心数据中生成一个新的数据模型版本,然后使用Xcode 7进行构build。似乎创build一个新的模型版本会创build优化的模型文件。 在我的testing中,即使有这个文件创buildXcode 6.4仍然会引发错误。 直到我用Xcode 7.0.1试了一下,警告就消失了。
这是猜测,但我认为如果你有一个现有的项目,并没有创build一个新的数据模型版本,并与Xcode 7构build.omo文件丢失,所以它抛出的警告,因为它无法find该文件。 但是,如果您已经对数据模型进行了版本化,并使用Xcode 6.4进行构build,则似乎以前的Xcode版本不会对优化的版本进行正确的处理,即使在那里,也不会加载它。 这些只是我的观察。
我validation了我有一个优化模型(.omo文件)加载通过执行以下操作:1.归档您的项目2.将.ipa扩展名更改为.zip 3.展开您的zip文件4.单击“有效内容”文件夹并在文件夹中的应用程序包上右键单击(或cmd单击),然后select“显示包装内容”。 5.点击.momd目录,你应该在那里看到所有可用的托pipe对象模型。
如果你只有.mom文件和没有.omo文件,那么这个警告是完全合理的,应用程序无法打开一个不存在的文件。
在我的testing中,似乎警告只是信息。 我从来没有因为它而崩溃。 看来核心数据可能会先尝试加载优化模型,如果失败则回退到常规的.momd模型。 这只是我的猜测。
我不确定这里的一切是否完全正确,这正是我目前为止所尝试的debugging过程中所观察到的。 如果其他人可以提供更多的信息,我欢迎您的意见。
我find了一个解决scheme。 我重写了整个模式,当我运行代码时,我摆脱了核心数据中的警告。
我build议在尝试之前请先备份。
希望它可以帮助你。
今天早上我遇到了这个问题。 做了一个小黑客运行。 我认为这与版本控制不匹配有关,但我不确定。
无论如何,如果你正在加载一个momd文件,只需在NSURL后面添加一个“/[filename].mom”即可。
在我的情况下,我正在加载文件Countly.momd,并最终这样做:
// Original loading NSURL modelURL = [[NSBundle bundleForClass:[CountlyDB class]] URLForResource:@"Countly" withExtension:@"momd"]; // Small hack modelURL = [modelURL URLByAppendingPathComponent:@"Countly.mom"];
更新:我使用的是使用CoreData的POD。 直接删除吊舱并添加源代码等直接导致问题消失。
所以这可能是一个问题。
我想回答那些在编写拥有自己的CoreData模型的自己的pod时遇到这个问题的人。 可能你已经把你的模型定义放到了bundle中(这很好),但是你在错误的bundle中search了momd
文件。
假设您已经在podspec中定义了您的包,如下所示:
'MYPodBundle' => [ 'Model/*.{xcdatamodeld,xcdatamodel}' ]
那么你应该先find这个包,然后在里面find你的模型。
NSURL *bundleURL = [[NSBundle bundleForClass:[MYEntity class]] URLForResource:@"MYPodBundle" withExtension:@"bundle"]; NSBundle *bundle = [NSBundle bundleWithURL:bundleURL]; NSString *modelPath = [bundle pathForResource:@"MYCoreDataModel" ofType:@"momd"]; NSManagedObjectModel *managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:modelPath]];
所以你可以继续创buildCoreData堆栈。
//这可能有点偏离主题,因为你不是在编写自己的pod,但是你的回答是在谷歌的顶部。
只需删除警告消息中标识的database.omo文件并重build项目即可。 这应该创build一个新的.omo文件,并且警告消息应该消失。