2010-09-06 129 views
1

我想從一個.xcdatamodel文件遷移到另一個。我有一個NSEntityMigrationPolicy子類,其名稱已在xcode-> .xcmappingmodel文件 - >實體 - >「自定義策略」字段中輸入。NSEntityMigrationPolicy子類方法不被調用

我運行我的應用程序,它成功地打開並運行我的數據的以前版本,所以我只能假設基本的遷移工作。但是我的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]) { 

回答

4

我知道這個問題很老,但這可能會幫助別人!

這是因爲您可以選擇NSInferMappingModelAutomaticallyOption set - 這意味着正在運行輕量級遷移,而不是使用您的映射模型。刪除此選項,留下* NSMigratePersistentStoresAutomaticallyOption *到位,所有應該工作。

+0

啊,這很酷,謝謝! ...但是如果我也想要自動映射發生呢?所以,我在模型版本16上。我想要從15到16的手動遷移,但以前的遷移可以是自動的。 – Benjohn 2017-02-04 22:51:10

0

我面臨着同樣的問題。在我的情況下,這是因爲核心數據無法在生成的應用程序包中找到我編譯的數據映射文件(具有'cdm'擴展名的文件)。當我手動將該文件從嵌套包移到應用程序包的根目錄時(MyApp.app \ NestedBundle.bundle \ MyMapping.cdm - > MyApp.app \ MyMapping.cdm),一切正常。但是這樣的文件佈局違反了應用程序包結構的當前邏輯,因此我會嘗試讓Core Data在嵌套包中查看我的cdm文件。

UPD:看來最好的解決方案是使用自定義初始化進行遷移過程。非常好的例子可以在這裏找到 - http://media.pragprog.com/titles/mzcd/code/ProgressiveMigration/AppDelegate.m。我已經採用這個代碼來搜索所有包,它工作正常。