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


76

在带有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'上加载优化模型

我找不到与此相关的内容,有人对此消息有任何线索吗?


2
我使用Xcode 6看到类似的消息,但仅当部署到iOS 9设备或sim卡时才出现。在使用Xcode 7 Beta的设备或sim卡上运行任何iOS时,我看不到它。因此,鉴于iOS 9仍处于测试阶段,我猜测这是特定于Xcode 6 iOS 9组合的错误。我暂时将其忽略。我的应用程序工作正常,所以我不打算花时间寻找到这一点,直到我看到的iOS 9/7的Xcode的发布候选版本
托尼·亚当斯

6
我也通过Xcode 7 GM得到了这个。任何提示此错误消息是关于什么的?
Buju 2015年

2
与xcode 7和iOS 9相同
Tatarasanu Victor Victor

1
GoogleMaps
也会遇到

2
开始使用xcode 9(使用xcode 8创建的原始架构)时,在新项目上遇到此错误。
lal

Answers:


13

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

我一直在使用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模型。不过,这只是我的推测。

我不确定这里是否所有内容都是正确的,这就是我到目前为止在尝试调试时所观察到的。如果还有其他人可以提供更多信息,欢迎您的投入。


“在我的测试中,警告似乎只是提供信息。因此,我从没有崩溃过。” 我有相同的经验:我从Xcode 6得到警告,但是一切正常。我有点害怕将应用发送到App Store并仍然带有此警告,并且我无法使用Xcode 7进行构建...我们确定这只是一个警告,不会发生崩溃吗?
cdf1982 '16

1
我一直在使用Xcode 7进行构建,因此我再也没有遇到过该错误,但是在Xcode 6附带的版本中,我没有从中遇到任何崩溃。如果您想跟踪发生的任何崩溃,我建议您Twitter的fabric / crashlytics框架。
digitalHound

4

今天早上我遇到了这个问题。做了一个小技巧来使其运行。我认为这与版本不匹配有关,但我不确定。

无论如何,如果要加载妈妈文件,只需在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。从仓库中删除吊舱并添加源等直接解决了这个问题。

因此,这可能是豆荚问题。


2
嘿-这对我和其他许多读者来说都不是很清楚。您能解释一下删除Pod并从仓库中添加源的过程(在何处获得它,做什么)。这个错误是个大问题,这篇文章似乎是您所做的唯一有用的事情。如果您能详细说明,我们将不胜感激。
kneuben_studdard

9
是的,认真。我在使用GoogleMaps的pod时遇到错误,并且发生了-/GoogleMaps.bundle/GMSCacheStorage.momd
Storage.omo'– durazno 2015年

您使用MagicalRecord吗?这可能与MR + CocoaPods有关吗?
Buju 2015年

1
这个答案是假的。这个问题与pod无关。不要浪费时间尝试这个!
durazno 2015年

1
@DiAvisoo的“小技巧”挽救了我的生命。我没有你们正在谈论的播客问题(我来自2017年的未来)。但是我试图在Xcode 9中为iOS 9.3+应用程序创建的Core Data应用程序中添加向后兼容性。DiAvisoo的“小技巧”的快速3版本解决了我的“大”问题:{code}让ios9modelURL = modelURL?.appendingPathComponent(“ Countly.mom”){code}。
罗布(Rob)

3

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

我建议您先备份,然后再尝试此操作。

希望对您有帮助。


1
是的,我重写了架构。
Mahesh

9
抱歉,该方案如何改写?
马库斯

3

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

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什么?
spnkr

如果您有多个版本的,则用于迁移Model。如果您不这样做,则将其删除
brahimm

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的顶部。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.