2012-05-05 12 views
0

私のアプリケーションのコアデータモデルを変更するたびに、次の起動時に「ストアを開くために使用されたモデルがストアの作成に使用されたモデルと互換性がありません」というエラーが発生します。NSPersistentStoreCoordinator - スキーマの互換性エラーを処理する方法は?

これを避ける唯一の信頼できる方法は、手動でアプリケーションを削除してXcodeに再インストールさせるか、またはCore Dataストアの.sqliteストアファイルを手動で吹き飛ばす方法です。これは明らかにユーザーに出荷するために実行可能ではありません。私も「エラーを適切に処理」する方法上の任意のサンプルや指示を見つけることができませんでした

__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { 
    /* 
    TODO: Replace this implementation with code to handle the error appropriately. 

    ... 

    If you encounter schema incompatibility errors during development, you can reduce their frequency by: 
    * Simply deleting the existing store: 
    [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil] 

    * Performing automatic lightweight migration by passing the following dictionary as the options parameter: 
    [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 

    */ 

:NSPersistentStoreCoordinatorを初期化するための

AppleのデフォルトのApp委任テンプレートは、このコメントが含まれています。

このケースではデータベースを吹き飛ばして、オンラインデータから再生成することができます。これは私が手動でデータベースを吹き飛ばすときに行うことです。しかし、どうすればこのエラー状態に自動的に対応できますか?

ベストプラクティスを説明するサンプルがありますか?

答えて

1

最も簡単な方法は、軽量移行を使用することです。 Appleのドキュメントhttp://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmLightweightMigration.htmlを参照してください。

新しいアプリケーションバージョンでモデルを変更する必要がある場合は、新しいモデルを作成します。これはXcodeで行います。現在のモデルを選択し、メニューから選択します。エディタ/モデルバージョンの追加...これがなければ、自動移行は機能しません。

+0

アプリ内のすべてのデータはオンラインソースからキャッシュされるので、複数のモデルを混乱させるのではなく、モデルが変更されたことを検出して店舗を吹き飛ばすことができます。私はそれを行うためのベストプラクティスと考えられるものの良い例をまだ見ていません。 – radven

+0

これも可能です。 '[psc addPersistentStoreWithType:configuration:options:error']が失敗した場合は、ローカルストア(sqliteファイル)を削除してmanagedObjectModelを再作成し、新しいデータで埋めます(またはバンドルからコピーするだけです)。私はローカルバックアップから破損したデータベースを復元するために私のアプリでこれを作った。 –

関連する問題