核心数据 - 无法在路径中加载优化模型

时间:2015-08-26 18:19:58

标签: ios objective-c xcode core-data ios9

我在我的iPhone 6中使用iOS 9 beta 5从Xcode 6运行我的应用程序时,在我的控制台中获得了一些这些打印:

  

CoreData:无法在路径'/var/mobile/Containers/Bundle/Application/0000000B-BDBC-0000-000B-0000FB00000B/Distribution.app/database.momd/database.omo'

加载优化模型

我找不到与此相关的内容,是否有人对此消息有所了解?

5 个答案:

答案 0 :(得分:10)

我遇到过这个问题并做了一些挖掘。

我一直在使用Xcode 6.4进行构建,看起来之前的核心数据只在MyApp.ipa momd目录中生成了一个.mom文件。此截图来自一个已经看过几个版本的Xcode的项目。

请注意,所有旧版本的版本只有.mom文件。我今天刚创建了一个新的模型版本,它同时包含.mom和.omo文件。

enter image description here

似乎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的解决方案正在起作用的原因是因为重写整个架构会创建app在应用程序包中寻找的.omo文件。

我的解决方案是在核心数据中生成新的数据模型版本,然后使用Xcode 7进行构建。似乎创建新的模型版本会创建优化的模型文件。在我的测试中,即使使用此文件创建Xcode 6.4仍然会抛出错误。直到我用Xcode 7.0.1尝试它才警告消失了。

这是推测,但我认为如果您有一个现有的项目并且没有创建新的数据模型版本并使用Xcode 7构建缺少.omo文件,那么它会抛出警告,因为它无法找到文件。但是,如果您对数据模型进行版本化并使用Xcode 6.4进行构建,那么早期的Xcode版本似乎无法正确使用优化版本,即使它在那里也不会加载它。这些只是我的观察结果。

我通过执行以下操作验证了我要加载的优化模型(.omo文件):     存档您的项目     2.将.ipa扩展名更改为.zip     3.展开您的zip文件     4.点击"有效载荷"文件夹中的应用程序包上的文件夹和右键单击(或cmd单击),然后选择"显示包内容"。     5.单击.momd目录,您应该在那里看到所有可用的托管对象模型。

如果您拥有的是.mom文件而没有.omo文件,则警告完全合理,应用程序无法打开不存在的文件。

在我的测试中,警告似乎只是提供信息。我从来没有因为它而崩溃。似乎核心数据可能首先尝试加载优化模型,如果失败则回退到常规.momd模型。这只是我的推测。

我不确定这里的所有内容是否完全正确,这正是我迄今为止在尝试调试时所观察到的。如果其他人可以提供更多信息,我欢迎您的意见。

答案 1 :(得分:4)

今天早上我遇到了这个问题。做了一个小小的破解让它运行起来。我认为它与版本不匹配有关,但我不确定。

无论如何,如果你正在加载一个妈妈文件,只需附加一个" / [filename] .mom"到NSURL让它运转起来。

在我的情况下,我正在加载文件Countly.momd并最终执行此操作:

// Original loading
NSURL modelURL = [[NSBundle bundleForClass:[CountlyDB class]] URLForResource:@"Countly" withExtension:@"momd"];

// Small hack
modelURL = [modelURL URLByAppendingPathComponent:@"Countly.mom"];

更新: 我使用的是使用CoreData的POD。从repo中删除pod并添加源等会使问题消失。

所以它可能是一个pod问题。

答案 2 :(得分:3)

我找到了解决方案。我重写了整个架构,当我运行代码时,我从核心数据中删除了那些警告。

我建议您在尝试之前先备份。

希望它对你有所帮助。

答案 3 :(得分:2)

  

经过长时间的搜索,就像这样:

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

 ...

答案 4 :(得分:0)

我想回答在编写拥有自己的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的顶部。