找不到momd文件:核心数据问题

the*_*ott 18 iphone core-data objective-c ipad ios

哎呀!我把事搞砸了!

我是Core Data noob,正在开发我的第一个iOS应用程序.经过多次Stack Overflowing我正在使用这段代码:

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");
Run Code Online (Sandbox Code Playgroud)

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

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

如何重新定位此sqlite/momd文件?"清洁"和"清除所有目标"显示为灰色.

我很高兴发布我的应用程序中的相关代码,这将有助于解释这个问题但是有大量与Core Data相关的代码,我不明白,所以我不确定要发布什么部分!任何帮助是极大的赞赏.

Yuj*_*uji 44

以下是一些建议:

  • 您发布的用于获取.mom(d)文件的代码并不是完全推荐的方式.mergedModelFromBundles改为使用,如

    self.managedObjectContent= [NSManagedObjectModel mergedModelFromBundles:nil];
    
    Run Code Online (Sandbox Code Playgroud)

    它负责获取路径,选择/合并正确的,mom或者momd一步一步地初始化MOC.你应该用它.但请注意,您需要暂时清理构建过程,如本SO问题/答案中所述.

  • 这表明,虽然通过StackOverflow进行爬行通常很好,但是当你处理像CoreData这样的大型框架时,这并不是最好的方法.

    老实说,花一天时间从头到尾阅读文档.您可能想要谷歌代码并立即开始编码,但从长远来看,阅读文档肯定会大大节省开发时间.

    此外,Marcus Zarra的CoreData一书(见这里)给了我很多帮助.它可能看起来很昂贵,但它完全值得.

  • 在另一个主题上,我认为将预先编写的sqlite文件放入模拟器的目录(内部~/Library/Application Support/iPhone Simulator/)即使是出于开发目的也不是一个好策略...因为它在真实设备上不起作用.如果您需要这样做,请将sqlite文件作为应用程序的资源,并在启动时将其复制到DocumentsCaches,然后使用它.

  • 我不认为你应该说它"选择"任何东西,当然不会初始化MOC.它所做的就是找到给定包中的所有模型并合并它们.如果您不需要合并多个模型,则指定模型URL也没有任何问题.Apple明确提出了这个和清洁选项作为CD编程指南中此特定问题的解决方案. (4认同)

小智 18

如果清洁目标菜单项是灰色的,则可能是您正在运行该应用程序.

你获得mom/momd路径的方式看起来就像你试图在事后整合CoreData(而不是在创建项目时选择包含它).我遇到了和你一样的问题.查找momd的默认代码假定它存在,并且如果您将数据模型的版本添加到项目中,您也应该能够.

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

到目前为止,我发现的任何CoreData教程都没有包含这些步骤.我希望它有用!

  • 在Xcode 4中,您可以通过选择编辑器 - >添加模型版本来添加新版本. (3认同)

Ste*_*man 7

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

[[NSBundle bundleForClass:[self class]] pathForResource:@"CoreData" ofType:@"momd"]
Run Code Online (Sandbox Code Playgroud)

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

如果您不熟悉我引用的对象,请查看apple文档以获得非常有用的概述.您肯定希望花时间去掌握完整的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