使用子实体从单个实体迁移到抽象父实体,不调用NSEntityMigrationPolicy

时间:2011-03-03 23:00:49

标签: iphone objective-c xcode core-data mapping-model

我正在尝试升级当前的应用程序以使用具有专用子实体的抽象父实体。 我已经创建了一个自定义的NSEntityMigrationPolicy,并且在映射模型中我将自定义策略设置为我的类的名称。

我正在初始化我的持久存储,这应该是相当标准的:

NSError *error=nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                    [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                     nil];

if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
    NSLog(@"Error adding persistent store : %@",[error description]);
    NSAssert(error==nil,[error localizedDescription]);
}    

当我运行应用程序时,我收到以下错误:

  

因未捕获而终止应用   例外   'NSInternalInconsistencyException',   理由:'手术不可能   完成。 (可可错误134140。)'

[错误userInfo]包含“原因=无法找到迁移的映射模型

我已经确认数据模型的版本1将打开,如果我设置了NSInferMappingModelAutomaticallyOption,我将获得迁移,尽管我的实体未正确迁移(正如预期的那样)。

我已经验证了映射模型(cdm)在应用程序包中,但不知怎的,它拒绝找到它。 我还在自定义迁移策略中设置了断点和NSLog()语句,并且没有运行,无论是否有NSInferMappingModelAutomaticallyOption

有关为何无法找到映射模型的任何提示?

2 个答案:

答案 0 :(得分:2)

首先,抽象实体附加了相当大的惩罚。摘要的所有子项都将存储在同一个表中。这将创建一个非常宽的表,有很多空白。我建议您检查一下您的数据模型并确保这是您真正想要的。

其次,如果您找不到映射模型,则表示它没有与源或目标对齐。如果在创建映射模型后更改了目标,则无法找到该映射。创建映射模型需要是新模型完成后的最后一步。我甚至建议锁定模型。

答案 1 :(得分:0)

我似乎已经解决了上述问题,虽然我不知道我做了什么。

尝试了4天让迁移工作,我终于放弃了,抓了我的设计,然后重新开始。 在这个过程的某个地方,我将git的master分支重置为较早的分支以检查一些细节,我不小心启动了调试器。 令我惊讶的是,它现在运行了很好的迁移,一切正常。

我最好的猜测是XCode有一些旧的迁移,它在清理构建时无法删除(即使我手动删除了构建目录)