2011-12-17 8 views
2

私は、余分なオブジェクトとリワークされたリレーションシップを持つコアデータモデルの新しいバージョンを作成しました。コアデータモデルの新しいバージョンを追加しますか?

私は現在、Medical_Codes.xcdatamodelMedical_Codes_ 2.xcdatamodelの両方のファイルを持っています。

古いNSManagedObjectクラスファイルを削除して再作成する必要がありますか?

永続的ストアコードを変更する必要はありますか?

- (NSManagedObjectModel *)managedObjectModel 
{ 
    if (__managedObjectModel != nil) 
    { 
     return __managedObjectModel; 
    } 
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Medical_Codes" withExtension:@"mom"]; 
    __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 
    return __managedObjectModel; 
} 

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 
{ 
    if (__persistentStoreCoordinator != nil) 
    { 
     return __persistentStoreCoordinator; 
    } 

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Medical_Codes.sqlite"]; 

    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    if (![fileManager fileExistsAtPath:[storeURL path]]) 
    { 
     NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"Medical_Codes" ofType:@"sqlite"]; 

     if (!defaultStorePath) 
     { 
      NSLog(@"Error: Could not locate Medical_Codes.sqlite in app bundle"); 
      return nil; 
     } 

     NSError *error = nil; 

     if (![fileManager copyItemAtPath:defaultStorePath toPath:[storeURL path] error:&error]) 
     { 
      NSLog(@"Error copying sqlite from bundle to documents directory: %@, %@", error, [error userInfo]); 
      return nil; 
     } 
    } 

    NSError *error = nil; 
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) 
    { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    }  

    return __persistentStoreCoordinator; 
} 

答えて

4

CoreDataは、新しいスキーマにデータベースの古いスキーマをさまざまなレベルで移行します。軽量な移行が可能な場合もあります。新しいモデルを作成し、新しい管理対象オブジェクトクラスを生成する場合を除いて、特別な作業は必要ありません。次にアプリケーションを起動すると、モデルマネージャーはその魔法を実行し、古いデータを新しいスキーマに移行します。

ただし、新しいモデルが古いモデルと大きく異なる場合、CoreDataに古いものから新しいものへのマッピングに必要な移行情報を与えるモデルマッピングファイルを作成する必要があります。このマッピングモデルファイルはXcodeによってバンドルにコピーされ、モデルマネージャはそれを使用して必要な移行を行います。

また、実行時に永続ストアコーディネータを作成する際にいくつかの追加オプションを渡す必要があります(永続的なストアコーディネータコードを少し変更する必要があります)。やや好きです:

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

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

あなたの最初の質問にお答えしてください。新しい属性または関係を追加した場合は、新しい管理対象オブジェクトファイルを作成する必要があります。既存の属性または関係のオプションの一部を変更しただけでは、古い管理オブジェクトファイルは有効です。

まだお持ちでない場合は、AppleがCoreDataについて書いたすべてのものを読んでください。私はオンライン文書よりも優れている本をまだ読んでいない。特に、versioning and migrationに関する情報を読んでください。

+0

これがJonの助けになるかどうかはわかりませんが、これは私が今までに見た中で最高の答えでした。それは間違いなく自分のマイグレーションの問題で私を助けました。 – lukecampbell

+0

ありがとう、私は賛辞を感謝します。私はそれが誰かを助けたことを喜んでいる。 – gschandler

+0

アップルのCore Dataのドキュメントは素晴らしいです。特に、バージョニングの話題については特にそうです。 –