私のアプリケーションのコアデータモデルを変更するたびに、次の起動時に「ストアを開くために使用されたモデルがストアの作成に使用されたモデルと互換性がありません」というエラーが発生します。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委任テンプレートは、このコメントが含まれています。
このケースではデータベースを吹き飛ばして、オンラインデータから再生成することができます。これは私が手動でデータベースを吹き飛ばすときに行うことです。しかし、どうすればこのエラー状態に自動的に対応できますか?
ベストプラクティスを説明するサンプルがありますか?
アプリ内のすべてのデータはオンラインソースからキャッシュされるので、複数のモデルを混乱させるのではなく、モデルが変更されたことを検出して店舗を吹き飛ばすことができます。私はそれを行うためのベストプラクティスと考えられるものの良い例をまだ見ていません。 – radven
これも可能です。 '[psc addPersistentStoreWithType:configuration:options:error']が失敗した場合は、ローカルストア(sqliteファイル)を削除してmanagedObjectModelを再作成し、新しいデータで埋めます(またはバンドルからコピーするだけです)。私はローカルバックアップから破損したデータベースを復元するために私のアプリでこれを作った。 –