无法在managedObjectContext中合并模型(基本Coredata)

时间:2011-06-08 15:46:23

标签: ios core-data uitabbarcontroller

我遇到了一个似乎涉及迁移的错误,但我没有使用任何迁移。这里仍然是基本的核心数据。

我有一个现有的应用程序,我正在尝试添加Core Data。我已将相关代码放入App Delegate中。该应用程序是一个基本的选项卡应用程序。

如何在委托之外的其他控制器中访问Core Data?谷歌搜索后,我认为这样做的方式是:

app = (RootAppDelegate*)[UIApplication sharedApplication].delegate;    
FirstViewController.managedObjectContext = app.managedObjectContext;

当我这样做时,我得到:

  

* 由于未捕获的异常而终止应用   'NSInvalidArgumentException',原因:   '无法合并两种不同的模型   名为'Event'的实体

我在这里做错了什么?

3 个答案:

答案 0 :(得分:1)

您可能在项目中有两个或更多.xdatamodel文件,每个文件都有Entity属性。这是由Xcode模板项目生成的实体,因此您可能复制了一个模板数据模型文件。

您在控制器中收到错误,因为模板应用程序委托在访问managedObjectContext属性之前不会初始化Core Data堆栈。访问managedObjectContext属性会触发加载managedObjectModel属性。模板使用mergedModelFromBundles:创建模型,该模型扫描应用程序包中的所有模型文件,并尝试从中构建单个模型。

如果您有两个或更多具有相同名称的实体的模型,则会收到您看到的错误。此上下文中的merge与迁移无关,而是合并同一版本中使用的多个模型文件。

答案 1 :(得分:0)

您是否更改了模型(在开发过程中)并且应用程序是使用之前的模型安装在设备/ SIM上的?

如果是这样,只需删除该应用并重新运行,它应该可以正常工作。

答案 2 :(得分:0)

  

如何在委托之外的其他控制器中访问Core Data?

访问NSManagedObjectContext的首选方法是通过NSManagedObject实例。例如:

[anEntity managedObjectContext];

您还可以将NSManagedObjectContext的引用传递给需要它的视图控制器。

更新

如果您在设置持久性存储协调器时启用了自动迁移,那么您需要在managedObjectModel访问器中执行一些额外步骤的帖子suggests

- (NSManagedObjectModel *)managedObjectModel {

    if (managedObjectModel != nil) {
        return managedObjectModel;
    }

    NSString *path = [[NSBundle mainBundle] pathForResource:@"Event" ofType:@"momd"];
    NSURL *momURL = [NSURL fileURLWithPath:path];
    managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];

    return managedObjectModel;
}

这是一个较旧的解决方案(不确定它仍然可以做到这一点)。