2014-07-26 162 views
2

我試圖遷移到我的項目中的一個新的完全不同的模型。對於輕量級遷移,這些更改太多了,我認爲最好的方法是遍歷頂層對象並自己設置所有屬性和關係。核心數據手動遷移

如何將遷移過程設置爲完全手動。我已經看過NSMigrationManager,這似乎需要一個NSMappingModel。我見過的唯一示例和教程使用inferredMappingModelForSourceModel:destinationModel:error:,這是我無法使用的,因爲它無法推斷映射模型。

我在正確的道路上,如果是這樣我怎麼能在代碼中完全手動創建一個映射模型?謝謝您的幫助。

回答

1

如果您的模型更改至少有一個源和目標實體級別映射(例如,您的舊模型中有一個Vehicle實體,現在您想將該數據遷移到Car),那麼您可以使用自定義映射模型與遷移策略。

該過程相當簡單,在Xcode中,嘗試添加一個新的映射模型文件到您的項目中,選擇源模型版本和目標模型版本。 Xcode試圖找出源和目標實體的屬性之間的映射關係。如果無法執行,則只需將映射留空即可,您可以設置自己的映射。

如果您想在映射過程中執行除簡單賦值,消隱或設置屬性的默認值之外的其他操作,請使用名爲NSEntityMigrationPolicy的東西。創建自己的子類,並實現這個方法做你的自定義映射:

- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)instance 
             entityMapping:(NSEntityMapping *)mapping 
              manager:(NSMigrationManager *)manager 
               error:(NSError **)error { 
    NSArray *_properties = [mapping attributeMappings]; 
    for (NSPropertyMapping *_property in _properties) { 
     if ([[_property name] isEqualToString:@"companyName"]) { 
      NSExpression *_expression = [NSExpression expressionForConstantValue:@"10to1"]; 
      [_property setValueExpression:_expression]; 
     } 
    } 

    return [super createDestinationInstancesForSourceInstance:instance 
               entityMapping:mapping 
                 manager:manager 
                 error:error]; 
} 

您可以閱讀更多關於如何做一個自定義遷移here

0

結賬CDWrangler。它是一個開源的Core Data控制器,可以逐步處理輕量級和手動遷移。

後您創建映射模型,你需要的任何自定義策略,你只需要做到這一點

// Migration 
if ([[CDWrangler sharedWrangler] isMigrationNeeded]) { 
    // The key is the name of your starting model, and the value is the name of your mapping model. In this example they are Model.xcdatamodel and MappingModel.xcmappingmodel 
    [CDWrangler sharedWrangler].mappingsForModels = @{@"Model": @"MappingModel"}; 
    [[CDWrangler sharedWrangler] migrate]; 
}