【发布时间】:2014-09-25 03:18:00
【问题描述】:
我正在尝试将我的一个应用程序的特定部分迁移到一个框架中,以便我可以在我的应用程序本身和其中一个新奇的 iOS 8 小部件中使用它。这部分是处理我在 Core Data 中的所有数据的部分。将所有内容移动并访问它非常简单。我只是无法访问其中的momd 文件。
创建NSManagedObjectModel 时,我仍然尝试加载momd,如Apple 的代码模板所示:
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyApp" withExtension:@"momd"];
__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
不幸的是,modelURL 保持 nil,因此MyApp 在访问核心数据堆栈时崩溃并出现此错误:
2014-08-01 22:39:56.885 MyApp[81375:7417914] Cannot create an NSPersistentStoreCoordinator with a nil model
2014-08-01 22:39:56.903 MyApp[81375:7417914] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Cannot create an NSPersistentStoreCoordinator with a nil model'
那么,在使用 Core Data 的框架内工作时,正确的方法是什么?
【问题讨论】:
-
文件本身是否包含在您正在构建的目标中?在我看来,您引用的文件没有作为目标构建的一部分添加。
-
我的
MyApp.xcdatamodeld包含在我的框架目标的成员资格中,是的。对于momd文件本身,我不知道是否可以在任何地方进行更改。那不是根据我的xcdatamodeld文件在构建期间/动态创建的吗? -
我从来没有将模型文件作为框架的一部分。当我需要包含模型时,我会从源代码构建模型。但是,我想您的问题是您正在查看主捆绑包。您是否尝试过遍历所有捆绑包,尝试从每个捆绑包中加载模型直到成功?使用
[NSBundle allBundles]? -
是的,我试过了。那对我不起作用。我遍历了所有捆绑包,试图找到“全部”
MyApp.momd。在运行完所有捆绑包后,我将存储所有 URL 的数组为空。 -
@flohei 这听起来不对。但是,还有另一种选择,而不是打包您的实际模型文件。设置好模型后,加载它,将其存档到
NSData对象,然后将其转换为 base64 编码字符串。您可以编写一个简单的程序来执行此操作,或者将其记录到控制台并剪切/粘贴字符串。然后,您可以将变量设置为该 base64 编码字符串。当您的代码运行时,您可以将字符串解码为NSData,然后将其解压缩为NSManagedObjectModel实例。您的模型现在是已编译库的一部分。
标签: ios core-data frameworks nsbundle nsmanagedobjectmodel