1

我正在尝试升级我当前的应用程序以使用带有专门子实体的抽象父实体。我创建了一个自定义 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。)'

[error userInfo] 包含“原因=找不到迁移的映射模型

我已经验证数据模型的版本 1 将打开,如果我设置 NSInferMappingModelAutomaticallyOption 我得到一个迁移,虽然我的实体没有正确迁移(如预期的那样)。

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

关于为什么似乎无法找到映射模型的任何提示?

4

2 回答 2

2

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

其次,如果您找不到映射模型,这意味着它没有与源或目标对齐。如果您在创建映射模型更改了目的地,它将找不到地图。创建映射模型需要是新模型完成后的最后一步。我什至建议锁定模型。

于 2011-03-08T08:48:19.527 回答
0

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

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

我最好的猜测是 XCode 有一些旧的迁移在清理构建时未能删除(即使我已经手动删除了构建目录)

于 2011-03-09T23:06:52.950 回答