首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在框架中使用核心数据的ManagedObjectModel?

如何在框架中使用核心数据的ManagedObjectModel?
EN

Stack Overflow用户
提问于 2014-08-02 04:43:24
回答 7查看 13.6K关注 0票数 35

我正在尝试将我的一个应用程序的特定部分迁移到一个框架中,这样我就可以在我的应用程序本身以及那些花哨的新iOS 8小部件中使用它。这个部分负责处理Core Data中的所有数据。把所有东西都移过去并访问它是非常简单的。我只是在访问里面的momd文件时遇到了问题。

在创建NSManagedObjectModel时,我仍然尝试加载momd,如苹果的代码模板所示:

代码语言:javascript
复制
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyApp" withExtension:@"momd"];
__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

不幸的是,modelURL保持nil,因此在访问核心数据堆栈时MyApp崩溃,并显示以下错误:

代码语言:javascript
复制
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的框架中工作时,正确的方法是什么呢?

EN

回答 7

Stack Overflow用户

发布于 2015-11-01 16:42:27

我在flohei的问题上有点晚了,但希望这能帮助其他漫步的人。可以在不执行script-fu复制资源的情况下使其正常工作!

默认情况下,Apple的核心数据模板如下所示:

代码语言:javascript
复制
lazy var managedObjectModel: NSManagedObjectModel = {
  let modelURL = NSBundle.mainBundle().URLForResource("MyCoreDataModel", withExtension: "momd")!
  return NSManagedObjectModel(contentsOfURL: modelURL)!
}()

这将从主包中加载您的核心数据资源。这里的关键是:如果核心数据模型被加载到框架中,那么.momd文件就在该框架的捆绑包中。因此,我们只需这样做:

代码语言:javascript
复制
lazy var managedObjectModel: NSManagedObjectModel = {
    let frameworkBundleIdentifier = "com.myorg.myframework"
    let customKitBundle = NSBundle(identifier: frameworkBundleIdentifier)!
    let modelURL = customKitBundle.URLForResource("MyCoreDataModel", withExtension: "momd")!
    return NSManagedObjectModel(contentsOfURL: modelURL)!
}()

这应该会让你启动并运行起来。

图片来源:https://www.andrewcbancroft.com/2015/08/25/sharing-a-core-data-model-with-a-swift-framework/

票数 40
EN

Stack Overflow用户

发布于 2015-04-05 09:14:35

您需要将xcdatamodeld文件拖放到使用该框架的目标的构建阶段|编译源中。然后,当目标运行它的NSBundle时,mainBundle将包含模型(momd文件)。

票数 13
EN

Stack Overflow用户

发布于 2015-08-09 16:05:02

@里克·桑托斯就快到了。我认为你只需要让它成为一个“妈妈”扩展,而不是“妈妈”,然后它就会运行。

代码语言:javascript
复制
lazy var managedObjectModel: NSManagedObjectModel = {
    let modelURL = NSBundle(forClass: self.dynamicType.self).URLForResource(self.dataModelName, withExtension: "mom")!
    return NSManagedObjectModel(contentsOfURL: modelURL)!
}()
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25088367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档