在带有iOS 9 beta 5的iPhone 6中从Xcode 6运行我的应用程序时,我在控制台中获得了一些打印件:
CoreData:无法在路径'/var/mobile/Containers/Bundle/Application/0000000B-BDBC-0000-000B-0000FB00000B/Distribution.app/database.momd/database.omo'上加载优化模型
我找不到与此相关的内容,有人对此消息有任何线索吗?
在带有iOS 9 beta 5的iPhone 6中从Xcode 6运行我的应用程序时,我在控制台中获得了一些打印件:
CoreData:无法在路径'/var/mobile/Containers/Bundle/Application/0000000B-BDBC-0000-000B-0000FB00000B/Distribution.app/database.momd/database.omo'上加载优化模型
我找不到与此相关的内容,有人对此消息有任何线索吗?
Answers:
我遇到了这个问题,并做了一些挖掘。
我一直在使用Xcode 6.4进行构建,看起来以前的核心数据仅在MyApp.ipa momd目录中生成了.mom文件。该屏幕快照来自一个已经查看了多个Xcode版本的项目。
请注意,所有较旧的型号版本都只有一个.mom文件。我今天刚刚创建了一个新的模型版本,它同时具有.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解决方案有效的原因是因为重新编写整个架构会创建应用程序在应用程序捆绑包中查找的.omo文件。
对我来说,解决方案是在核心数据中生成新的数据模型版本,然后使用Xcode 7进行构建。似乎创建新的模型版本会创建优化的模型文件。尽管在我的测试中,即使使用此文件创建了Xcode 6.4,仍然会引发错误。直到我使用Xcode 7.0.1进行尝试,警告才消失。
这是推测,但我想如果您有一个现有项目并且没有创建新的数据模型版本并使用Xcode 7构建该.omo文件丢失,那么它会发出警告,因为找不到该文件。但是,如果您已经对数据模型进行了版本控制并使用Xcode 6.4进行构建,则似乎早期的Xcode版本无法对优化版本进行正确的操作,即使已存在优化版本也不会加载它。这些只是我的观察。
通过执行以下操作,我验证了要加载的优化模型(.omo文件):1.归档项目2.将.ipa扩展名更改为.zip 3.展开zip文件4.单击“有效载荷”文件夹并在文件夹中的应用程序包上单击鼠标右键(或单击cmd),然后选择“显示软件包内容”。5.单击.momd目录,您应该在那里看到所有可用的托管对象模型。
如果您只拥有.mom文件而没有.omo文件,则该警告完全有意义,该应用无法打开不存在的文件。
在我的测试中,警告似乎只是提供信息。我从来没有因此而崩溃过。似乎核心数据可能首先尝试加载优化的模型,如果失败,则应使用常规的.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。从仓库中删除吊舱并添加源等直接解决了这个问题。
因此,这可能是豆荚问题。
经过长时间的搜索,它就像这样:
public lazy var persistentContainer: NSPersistentContainer = {
var modelURL = Bundle(for: type(of: self)).url(forResource: "Model", withExtension: "momd")!
// ===> here you append the nameOfVersion.mom you created
modelURL.appendPathComponent("Model 2.mom")
let managedObjectModel = NSManagedObjectModel(contentsOf: modelURL)
let container = NSPersistentContainer(name: "ModelFile", managedObjectModel: managedObjectModel!)
container.persistentStoreDescriptions.first?.shouldInferMappingModelAutomatically = false
...
shouldInferMappingModelAutomatically = false
什么?
Model
。如果您不这样做,则将其删除
我想回答在编写具有自己的CoreData模型的自己的pod时遇到此问题的人。可能您已将模型定义放入捆绑包中(很好),但是您momd
在错误的捆绑包中搜索文件。
假设您已经在podspec中定义了这样的包:
'MYPodBundle' => [
'Model/*.{xcdatamodeld,xcdatamodel}'
]
那么你应该先找到这个包,然后找到你的模型里面。
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]];
因此,您可以继续创建CoreData堆栈。
//这可能有点题外话,因为您不是在编写自己的Pod,而是您的答案在google的顶部。