NSEntityMigrationPolicy子类方法未被调用

时间:2010-09-06 13:25:40

标签: iphone objective-c cocoa core-data

我正在尝试从一个.xcdatamodel文件迁移到另一个.xcdatamodel文件。我有一个NSEntityMigrationPolicy子类,我在xcode->中输入的名称; .xcmappingmodel文件 - >实体 - > “自定义政策”字段。

我运行我的应用程序,该应用程序成功打开并运行以前版本的数据,因此我只能假设基本迁移已经有效。但是,我的NSEntityMigrationPolicy子类方法没有被调用,因此我可以运行更多的迁移代码。

@implementation TestMigrationPolicy

- (BOOL)beginEntityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError * *)error
{
    NSLog(@"this log is never shown!!!!");
    return YES;
}

有没有人有任何想法为什么我可能不会被调用?我是核心数据迁移的新手,我现在不知道为什么这不应该像我认为的那样。

如果有帮助,我就像这样创建持久性商店..

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                         [NSNumber numberWithBool:YES], 
                         NSMigratePersistentStoresAutomaticallyOption,
                         [NSNumber numberWithBool:YES],
                         NSInferMappingModelAutomaticallyOption,
                         nil];


NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSLog(@"storeUrl  %@", storeUrl);

if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {

2 个答案:

答案 0 :(得分:5)

我知道这个问题已经过时了,但这可能有助于其他人!

这是因为你有 NSInferMappingModelAutomaticallyOption 选项集 - 这意味着正在运行轻量级迁移,而不是使用你的映射模型。删除此选项,保留* NSMigratePersistentStoresAutomaticallyOption *,所有这些都应该有效。

答案 1 :(得分:-1)

我遇到了同样的问题。在我的情况下,这是因为Core Data无法在生成的应用程序包中找到我的编译数据映射文件(扩展名为'cdm'的文件)。当我手动将该文件从嵌套包移动到应用程序包的根目录(MyApp.app \ NestedBundle.bundle \ MyMapping.cdm - > MyApp.app \ MyMapping.cdm)时,一切正常。但是这样的文件布局违反了应用程序包结构的当前逻辑,因此我将尝试使Core Data也能在嵌套bundle中查看我的cdm文件。

UPD:似乎最好的解决方案是使用自定义初始化进行迁移过程。可以在这里找到非常好的例子 - http://media.pragprog.com/titles/mzcd/code/ProgressiveMigration/AppDelegate.m。我已经采用了这个代码来搜索所有的包,它运行正常。