您可以做的一件事是創建一個自定義遷移策略類,該類具有將您的屬性從原始值映射到新值的功能。例如,我有一個案例,我需要將名爲MyItems的實體與一組名爲「Items」的值實體直接關聯,以代替存儲itemID,以便將模型分割到多個商店。
舊的模式是這樣的:
新的模式是這樣的:
要做到這一點,我寫了一個名爲itemIDForItemName函數映射類,它被定義爲這樣的:
@interface Migration_Policy_v1tov2 : NSEntityMigrationPolicy {
NSMutableDictionary *namesToIDs;
}
- (NSNumber *) itemIDForItemName:(NSString *)name;
@end
#進口 「Migration_Policy_v1tov2.h」
@implementation Migration_Policy_v1tov2
- (BOOL)beginEntityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error {
namesToIDs = [NSMutableDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:1],@"Apples",
[NSNumber numberWithInt:2],@"Bananas",
[NSNumber numberWithInt:3],@"Peaches",
[NSNumber numberWithInt:4],@"Pears",
[NSNumber numberWithInt:5],@"Beef",
[NSNumber numberWithInt:6],@"Chicken",
[NSNumber numberWithInt:7],@"Fish",
[NSNumber numberWithInt:8],@"Asparagus",
[NSNumber numberWithInt:9],@"Potato",
[NSNumber numberWithInt:10],@"Carrot",nil];
return YES;
}
- (NSNumber *) itemIDForItemName:(NSString *)name {
NSNumber *iD = [namesToIDs objectForKey:name];
NSAssert(iD != nil,@"Error finding ID for item name:%@",name);
return iD;
}
@end
然後爲你的映射模型屬性相關的映射名稱您指定的值表達式作爲函數調用這樣的結果:FUNCTION($ entityPolicy,「itemIDForItemName」,$ source.name)。您還必須將該屬性的映射名稱的自定義策略字段設置爲映射類名稱(在本例中爲Migration_Policy_v1toV2)。
這是我最後做 – 2011-03-22 04:28:08
謝謝你這個答案!你簡短的例子爲我節省了很多時間和挫折。 (它會在一段時間內殺死Apple,在其文檔中包含這樣的內容嗎?) – quickthyme 2011-07-30 19:53:38
@gregc首先,感謝我在其他地方找不到的有趣方法。這正是我需要的。但不幸的是,我無法得到它的工作。看起來我的自定義遷移策略類中的方法未被調用。在生成的DB中,應由這些方法返回的值填充的字段爲空。而且,我在這些未觸發的方法中設置斷點。有什麼可以做錯的?你知道調試遷移過程的任何方式(或者至少確保它的執行)嗎?謝謝! – 2013-03-28 15:55:29