2011-03-03 107 views
1

我试图升级当前应用程序以使用具有专门子实体的抽象父实体。 我已经创建了一个自定义的NSEntityMigrationPolicy,并且在映射模型中我已将自定义策略设置为我的类的名称。从单个实体迁移到具有子实体的抽象父实体,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

我得出了同样的结论检查数据库后由我的应用程序在模拟器上生成。无论如何,如果所有实体最终都在同一个表中,那么我可以更好地设计我的模式,这种方式甚至可以实现简单的迁移。 – 2011-03-09 15:37:40

+0

虽然我的问题仍然没有回答(我已经在我的模式之后创建了几次迁移),但我将其标记为已解决。也许抽象的父实体对iOS应用程序来说有点矫枉过正。 – 2011-03-09 15:41:12

+0

经过几天拉我的头发,这帮了我。我删除了我的映射策略和映射模型,并重新开始。马库斯是正确的,创建映射模型和定制政策应该是你最后做的事情。非常感谢。 – RyanM 2012-06-08 18:08:23

0

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

经过4天的试验才得到迁移工作,我终于放弃了,划伤了我的设计,并重新开始。 在这个过程中的某个地方,我将git的主分支重置到了一个较早的分支,以检查一些细节,并且我意外地启动了调试器。 令我惊讶的是,它现在运行的迁移很好,一切正常。

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