【问题标题】:Can't find momd file: Core Data problems找不到 momd 文件:核心数据问题
【发布时间】:2011-05-31 00:01:59
【问题描述】:

天哪!我搞砸了!

我是一名 Core Data 菜鸟,正在开发我的第一个 iOS 应用程序。经过大量堆栈溢出后,我正在使用此代码:

NSString *path = [[NSBundle mainBundle] pathForResource:@"CoreData" ofType:@"momd"];
if (!path) {
    path = [[NSBundle mainBundle] pathForResource:@"CoreData" ofType:@"mom"];
}
NSAssert(path != nil, @"Unable to find Resource in main bundle");

CoreData 是我的应用程序的名称。

我试图通过在我的 iPhone 模拟器中找到 sqlite 文件的路径,然后将初始数据插入到该 sqlite 文件中,从而将初始数据放入应用程序中。但是在某些时候,我移动了 sqlite(认为它会创建一个新副本),从模拟器中删除了应用程序,并且 sqlite 文件消失了。我不确定我是否遗漏了该过程的某些部分(这是几个小时前),但最终结果是一切都搞砸了。

如何重新证实这个 sqlite / momd 文件? “清理”和“清理所有目标”显示为灰色。

我很高兴从我的应用程序中发布相关代码,这将有助于阐明这个问题,但是有大量与 Core Data 相关的代码我不明白,所以我不确定要发布哪个部分!非常感谢任何帮助。

【问题讨论】:

  • 对于遇到此问题的其他人,请注意:您在 pathForResource 中提供的 momd 文件夹名称区分大小写!

标签: iphone objective-c ipad core-data ios


【解决方案1】:

实用答案: 如果您遇到路径问题,可以尝试以下代码。您还需要检查您的 xcdatamodel 文件是否作为目标资源包含在内。

[[NSBundle bundleForClass:[self class]] pathForResource:@"CoreData" ofType:@"momd"]

更好的答案:表示您的 NSManagedObjectModel 的 momd 文件和您的 NSPersistentStore 对象使用的 sqlite 文件之间存在区别。使用 CoreData 的最佳方法是让 SDK 处理与 sqlite 的所有交互。关于 sqlite,您唯一需要设置的就是告诉您的 NSPersistantStore 将您的 sqlite 文件存放在哪里。您在托管对象模型中定义的托管对象将为您处理所有数据插入和更新。

如果您不熟悉我所引用的对象,请查看苹果文档以获得非常有用的概述。您肯定会想花时间掌握完整的 CoreData 堆栈,因为如果您按照 Apple 期望的方式使用 Core Data,那么时间投资的回报将大大减少。它是一种比许多 Web 开发人员习惯的更抽象的设计,但试图通过直接使用 SQLite 来规避这种抽象会产生其自身的复杂性。

http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdBasics.html#//apple_ref/doc/uid/TP40001650-TP1

【讨论】:

  • 这是为我做的,我做了一个合并,由于某种原因,从与应用程序一起复制的资源列表中删除了 xcdatamodel 文件。
【解决方案2】:

以下是一些建议:

  • 您发布的获取.mom(d) 文件的代码并非完全推荐的方式。请改用mergedModelFromBundles,如

    self.managedObjectContent= [NSManagedObjectModel mergedModelFromBundles:nil];
    

    它负责获取路径、选择/合并正确的mommomd,并一步一步初始化 MOC。您应该使用它。但请注意,您需要不时清理构建过程,如this SO question/answer 中所述。

  • 这表明,尽管通过 StackOverflow 进行爬网通常很好,但当您处理像 CoreData 这样的大型框架时,这并不是最好的方法。

    老实说,花一天时间从头到尾阅读the documentation。您可能想搜索一些代码并立即开始编码,但从长远来看,通读文档肯定会大大节省开发时间。

    此外,Marcus Zarra 的 CoreData 书(请参阅 here)对我帮助很大。它可能看起来很贵,但完全值得。

  • 1234563在真实设备上工作。如果需要,请将 sqlite 文件作为应用程序的资源,并在启动时将其复制到 DocumentsCaches,然后使用。

【讨论】:

  • 我认为你不应该说它“选择”任何东西,当然也不会初始化 MOC。它所做的就是找到给定包中的所有模型并将它们合并。如果您不需要合并多个模型,则指定模型 URL 也没有错。 Apple 在 CD 编程指南中明确提出了此选项和 ​​clean 选项作为针对此特定问题的解决方案。
  • @lhunath 我一直在研究核心数据,我会确认苹果确实说:initWithContentsOfURL:is the generally-preferred technique。感谢 Yuji 提供这本书的链接。可能会明白。
  • 如果您的应用是由不同的团队使用不同的 MOM 为应用的不同部分构建的,那么您肯定希望将主包中的所有模型合并为一个特定的语境!它们会不必要地纠缠在一起。此外,Apple 的 Core Data Programming Guide 在“初始化核心数据堆栈”部分显示将 NSURL 从 NSBundle URLForResource:withExtension: 传递到 NSManagedObjectModel initWithContentsOfURL:。这可能是 2010 年的一个很好的答案,但它可能会导致 2015 年的开发人员误入歧途。
  • 以我的经验,有时单独清理是行不通的,我必须重启Xcode和/或删除~/Library/Developer/Xcode/DerivedData的内容跨度>
【解决方案3】:

如果清理目标菜单项是灰色的,则可能是您的应用正在运行。

您获取 mom/momd 路径的方式看起来像是您事后尝试集成 CoreData(而不是在创建项目时选择包含它)。我和你可能有同样的问题。查找 momd 的默认代码假定它存在,如果您将数据模型的一个版本添加到项目中,您也应该能够这样做。

为此,请选择 xcdatamodel 文件,然后在“设计”菜单中选择“数据模型”>“添加模型版本”。然后,您将使用包含 Coredata.xcdatamodel 和新版本的子树进行 CoreData.xcdatamodeld。您可以删除额外的版本,您将拥有所需的层次结构。如果您构建并查看 App 包,您将看到 CoreData.momd 目录,其中包含 mom。

到目前为止,我发现的任何 CoreData 教程中都不包含这些步骤。希望对你有帮助!

【讨论】:

  • 这对我有用。事后我添加了 CoreData 并收到“nil model”错误,因为我的构建中没有 mom(d)。执行“添加模型版本”(+删除重复版本)就可以了!
  • 在 Xcode 4 中,您可以通过选择 Editor -> Add Model Version 添加新版本。
  • 这正是我一直在寻找的其他教程没有提到的缺失部分!谢谢!
【解决方案4】:

如果您为模型添加了版本,请将 .mom 更改为 .momd

    NSString *path = [[NSBundle mainBundle] pathForResource:@"CoreData" ofType:@"momd"];
if (!path) {
    path = [[NSBundle mainBundle] pathForResource:@"CoreData" ofType:@"momd"];

【讨论】:

    【解决方案5】:

    我发现在模拟器“磁盘映像”中查看我的可执行文件非常有价值。

    如果您进入 ~/Library/Application Support/iPhone Simulator//Applications,您可以在手机上看到应用程序。找出哪个是您的(使用 find 或查看日期),然后浏览到您的 target.app 并查找 .momd 文件。

    就我而言,我的 momd 名称与我的 .xcdatamodeld 文件名不同,这就是核心数据无法加载它的原因。一旦我更正了 AppDelegate 中的名称,事情就开始正常工作了。

    请注意,momd“文件”似乎实际上是一个目录(如 .app 设置)。

    --

    在添加初始化核心数据的代码方面;我也这样做了。我创建了一个启用核心数据的新空白项目,并复制了 AppDelegate 文件中核心数据的所有初始化步骤。有一大堆东西与初始化整个堆栈有关,所以如果不存在,你需要把它放在那里。

    【讨论】:

    • 这解决了我的问题。我从示例中复制+粘贴,并填写了我认为正确的 momd 文件名。原来文件名和我想的不一样。 +1
    猜你喜欢
    • 1970-01-01
    • 2015-05-20
    • 2011-07-03
    相关资源
    最近更新 更多