【问题标题】:Core Data - Failed to load optimized model at path核心数据 - 无法在路径加载优化模型
【发布时间】:2019-03-01 11:29:00
【问题描述】:

我在使用 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”加载优化模型

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

【问题讨论】:

  • 我在使用 Xcode 6 时看到了类似的消息,但仅在部署到 iOS 9 设备或 sim 时才出现。在设备上运行任何 iOS 或使用 Xcode 7 beta 时我看不到它。因此,鉴于 iOS 9 仍处于测试阶段,我猜这是 Xcode 6 iOS 9 组合特有的错误。我暂时忽略它。我的应用程序按预期运行,所以在我看到 iOS 9/Xcode 7 的候选发布版本之前,我不会花任何时间研究这个。
  • 我也用 Xcode 7 GM 得到了这个。知道这条错误消息是关于什么的吗?
  • 与 xcode 7 & iOS 9 相同
  • GoogleMaps 也会出现同样的问题
  • 在开始使用 xcode 9(使用 xcode 8 创建的原始架构)时在新项目上出现此错误。

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


【解决方案1】:

我遇到了这个问题并做了一些研究。

我一直在使用 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.点击“payload”文件夹,右键(或cmd点击)文件夹中的app bundle,选择“Show Package Contents”。 5. 单击 .momd 目录,您应该会在那里看到所有可用的托管对象模型。

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

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

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

【讨论】:

  • “在我的测试中,警告似乎只是信息性的。我从来没有因为它而崩溃过。”我有同样的经历:我从 Xcode 6 收到警告,但一切正常。我有点害怕将应用程序发送到 App Store,但仍然存在此警告,而且我无法使用 Xcode 7 构建它...我们确定这只是一个警告并且不会发生崩溃吗?
  • 我一直在使用 Xcode 7 进行构建,所以我不再遇到该错误,但在 Xcode 6 附带的版本中我没有遇到任何崩溃。如果你想跟踪如果发生任何崩溃,我都会推荐 Twitter 的 fabric/crashlytics 框架。
【解决方案2】:

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

无论如何,如果您正在加载一个 momd 文件,只需将“/[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 问题。

【讨论】:

  • 嘿-这对我来说并不清楚,可能还有很多其他读者。你能解释一下从 repo 中删除 pod 和添加源的过程(从哪里获取它,做什么等)。这个错误是一个大问题,而这篇文章似乎是你所做的唯一对你有用的事情。如果您能详细说明,我们将不胜感激。
  • 是的,认真的。我在使用 GoogleMaps 的 pod 时遇到错误,这会发生 - /GoogleMaps.bundle/GMSCacheStorage.momd/Storage.omo'
  • 你使用 MagicalRecord 吗?这可能与 MR + CocoaPods 有关吗?
  • 这个答案是错误的。这个问题与 pod 无关。不要浪费时间尝试这个!
  • @DiAvisoo 的“小技巧”救了我的命。我没有遇到你们谈论的这个 pod 问题(我来自 2017 年的未来)。但我试图在 Xcode 9 中为 iOS 9.3+ 应用程序创建的 Core Data 应用程序中添加向后兼容性。 DiAvisoo 的“small hack”的 swift 3 版本解决了我的“大”问题:{code}let ios9modelURL = modelURL?.appendingPathComponent("Countly.mom"){code}。
【解决方案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的原因是什么?
  • 如果您有多个版本的 Model,则用于迁移。如果您不这样做,则将其删除
【解决方案4】:

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

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

希望对你有所帮助。

【讨论】:

  • 是的,我重写了架构。
  • 对不起,方案是如何重写的?
【解决方案5】:

我想回答在编写拥有自己的 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,但你的答案在谷歌的顶部。

【讨论】:

    猜你喜欢
    • 2015-12-19
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    相关资源
    最近更新 更多