2011-03-20 129 views
4

我目前在我的實體上有一個cardType屬性,它在舊模型中可能是「數學」,「圖像」或「文本」。在新模型中,我將只使用「數學」和「文本」,並且還有一個hasImage屬性,如果舊的cardType是Image(我想要更改爲「Text」),那麼我想將其設置爲true。核心數據遷移:屬性映射值表達式

最後,我有一套另一個實體,「卡」,其中一套可以與一個套牌相關聯,並在每一個,我也有hasImage,我想設置爲true,如果甲板之前是「圖像」類型。

這是所有可能的使用價值表達式在我創建的兩個版本之間的映射模型,或者我將不得不做的其他?

我無法找到任何文檔告訴我在Value Expression中可能的值(Apple's doc - http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/CoreDataVersioning/Articles/vmMappingOverview.html%23//apple_ref/doc/uid/TP40004735-SW3 - 只有一個非常簡單的轉換)。如果我必須做別的事情,那會是什麼?這似乎很簡單,表達式應該能夠做到。

回答

24

您可以做的一件事是創建一個自定義遷移策略類,該類具有將您的屬性從原始值映射到新值的功能。例如,我有一個案例,我需要將名爲MyItems的實體與一組名爲「Items」的值實體直接關聯,以代替存儲itemID,以便將模型分割到多個商店。

舊的模式是這樣的: old model

新的模式是這樣的: new model

要做到這一點,我寫了一個名爲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)。

Mapping Model

+0

這是我最後做 – 2011-03-22 04:28:08

+1

謝謝你這個答案!你簡短的例子爲我節省了很多時間和挫折。 (它會在一段時間內殺死Apple,在其文檔中包含這樣的內容嗎?) – quickthyme 2011-07-30 19:53:38

+0

@gregc首先,感謝我在其他地方找不到的有趣方法。這正是我需要的。但不幸的是,我無法得到它的工作。看起來我的自定義遷移策略類中的方法未被調用。在生成的DB中,應由這些方法返回的值填充的字段爲空。而且,我在這些未觸發的方法中設置斷點。有什麼可以做錯的?你知道調試遷移過程的任何方式(或者至少確保它的執行)嗎?謝謝! – 2013-03-28 15:55:29