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

Posted

技术标签:

【中文标题】涉及新实体和一对多关系的核心数据迁移【英文标题】:Core data migration involving a new entity and a to-many relationship 【发布时间】:2011-04-05 18:27:07 【问题描述】:

我正在尝试向我的核心数据模型添加一个新实体(例如 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 - 还有一个问题 - 是否需要映射模型,或者自动迁移是否足够智能以处理新实体和关系?

【问题讨论】:

我确定这是迁移的问题;使用新的核心数据启动工作正常。 想不通,所以我重新开始。以为我做了和以前一样的事情,但这次它有效。我所做的:i)创建了一个反向关系 A > B,ii)自动生成 B 实现文件,iii)从 v2 映射到 v3,没有为关系指定任何值表达式,我也没有指定从 v2 到 v3 的迁移策略(对于 v1 到 v3 是),iv)在 A 中手动添加 @property 以与 B 建立关系。希望这对其他人有所帮助。 【参考方案1】:

我刚刚在自己的项目中解决了这个问题。当你有多个版本的数据模型时,[NSManagedObjectModel mergeModelFromBundles: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

【讨论】:

以上是关于涉及新实体和一对多关系的核心数据迁移的主要内容,如果未能解决你的问题,请参考以下文章

多对多的核心数据迁移

核心数据:迁移具有自引用属性的实体

核心数据模型迁移步骤

核心数据迁移——如何将两个实体合二为一

核心数据迁移:将关系从一个实体更改为其父实体后的异常

通过迁移将核心数据实体及其数据移动到新的核心数据模型文件中