核心数据迁移涉及新实体和多对多关系

时间:2011-04-05 18:27:07

标签: iphone ios core-data relationship core-data-migration

我正在尝试向我的核心数据模型添加一个新实体(比如B,带有两个“双”属性),并与现有实体(比如A)创建一个可选的多对多关系。我创建了新的模型修订版,其中包括新实体B,现有实体A和多对多关系A - >> B.这个新模型是默认模型。我创建了一个从v2到v3的映射模型(v1 - > v2迁移工作正常,只是实体A的数据类型更改),但没有为A与B的关系指定值表达式,也没有为B的属性指定值表达式。

当我运行应用程序时,尝试实例化托管对象模型managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];时收到以下错误。

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSMutableArray insertObject:atIndex:]: attempt to insert nil object at 0'.

问题可能是我没有在映射模型中为A与B的关系指定值表达式,但我认为它不是必需的,因为B是可选的,并且它在模型的v2中不存在。如果我必须为关系指定值表达式,那么对于不存在(因为它在模型的v2中不存在)可选关系,我该怎么做?

非常感谢任何帮助。

PS - 还有一个问题 - 即使是必要的映射模型,还是智能自动迁移才能处理新实体和关系?

1 个答案:

答案 0 :(得分:2)

我刚刚在自己的项目中解决了这个问题。当您拥有多个版本的数据模型时,[NSManagedObjectModel mergedModelFromBundles:nil]效果不佳。它试图包括所有这些,但不应该。

尝试使用类似的东西:

- (NSManagedObjectModel *)managedObjectModel {

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

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

    return managedObjectModel;
}

深入故事检查: http://iphonedevelopment.blogspot.com/2009/09/core-data-migration-problems.html