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

真棒! 我搞砸了!

我是核心数据noob,在我的第一个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模拟器中findsqlite文件的path,然后将其插入到sqlite文件中,将初始数据放入应用程序。 但是在某个时候,我移动了sqlite(认为它会创build一个新的副本),从模拟器中删除了应用程序,并且sqlite文件不见了。 我不确定我是否在这个过程的某个部分(这是几个小时前)离开,但最终的结果是一切都搞砸了。

我如何resubstantiate这个sqlite / momd文件? “清洁”和“清除所有目标”都是灰色的。

我很高兴从我的应用程序发布相关的代码,这将有助于解决这个问题,但有很多关于核心数据的代码,我不明白,所以我不知道什么部分发布! 任何帮助是极大的赞赏。

这里有几个build议:

  • 您为获取.mom(d)文件而发布的代码并不完全是推荐的方式。 在中使用mergedModelFromBundles

     self.managedObjectContent= [NSManagedObjectModel mergedModelFromBundles:nil]; 

    它负责获取path,select/合并正确的mommomd ,并一步一步初始化MOC。 你应该使用这个。 但是请注意,你需要一段时间清理构build过程,正如在这个SO问题/答案中所讨论的那样。

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

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

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

  • 在另一个话题上,我不认为这是一个好的策略,即使为了开发的目的,把预先熟的sqlite文件放到模拟器的目录(在~/Library/Application Support/iPhone Simulator/ )在真正的设备上工作。 如果您需要这样做,请将sqlite文件作为应用程序的资源,并在启动时将其复制到DocumentsCaches ,然后使用它。

如果干净的目标菜单项是灰色的,可能是您的应用程序正在运行。

你得到的妈妈/妈妈的path的方式看起来像你已经试图集成CoreData的事实(而不是select包括在创build项目时)。 我可能会遇到同样的问题。 寻找momd的默认代码假定它存在,并且如果您将数据模型的版本添加到项目中,您也应该可以。

为此,请selectxcdatamodel文件,然后在devise菜单中select数据模型>添加模型版本。 然后,您将拥有包含Coredata.xcdatamodel和新版本的子树的CoreData.xcdatamodeld。 您可以删除额外的版本,您将拥有所需的层次结构。 如果您构build并查看应用程序包,则会在内部看到带有妈妈的CoreData.momd目录。

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

实用的答案:如果你遇到path问题,你可以试试下面的代码。 您还需要检查您的xcdatamodel文件是否包含在您的目标资源中。

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

更好的回答:在代表NSManagedObjectModel的momd文件和NSPersistentStore对象使用的sqlite文件之间存在区别。 使用CoreData的最佳方法是让SDK处理与sqlite的所有交互。 你应该需要设置有关sqlite的唯一事情是告诉你的NSPersistantStore存放你的sqlite文件的地方。 您在托pipe对象模型中定义的托pipe对象将为您处理所有数据插入和更新。

如果您不熟悉我所引用的对象,请查看苹果文档以获得非常有用的概述。 你一定要花时间去掌握整个CoreData堆栈,因为如果你按照苹果公司的预期来处理Core Data的话,那么时间投资就会less得多。 这是一个比许多Web开发人员习以为常的更抽象的devise,但是试图通过直接与SQLite合作来规避这种抽象,从而创造出自己的一套复杂性。

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

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

如果您进入〜/图书馆/应用程序支持/ iPhone模拟器//应用程序,您可以看到手机上的应用程序。 找出哪一个是你的(使用find,或查看date),然后浏览到你的target.app并查找.momd文件。

在我的情况下,我的妈妈的名字是不同于我的.xcdatamodeld文件名,这就是为什么核心数据无法加载它。 一旦我更正了AppDelegate中的名字,事情就开始正常工作。

请注意,妈妈“文件”似乎实际上是一个目录(如.app安装程序)。

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

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

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