12

私はcore-dataを使用するココアアプリケーションを持っています。これは現在、管理対象オブジェクトモデルの4番目のバージョンです。

管理対象オブジェクトモデルには抽象エンティティが含まれていますが、これまでのところ、適切なマッピングモデルを作成し、addPersistentStoreWithType:configuration:options:errorを使用し、NSMigratePersistentStoresAutomaticallyOptionをYESに設定して永続ストアを作成することで、移行を機能させることができました。

NSDictionary *optionsDictionary = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
NSURL *url = [NSURL fileURLWithPath: [applicationSupportFolder stringByAppendingPathComponent: @"MyApp.xml"]];
NSError *error=nil;
[theCoordinator addPersistentStoreWithType:NSXMLStoreType configuration:nil URL:url options:optionsDictionary error:&error]

これは、モデルバージョン3から4に移行する場合に正常に機能します。これは、複数のエンティティに属性を追加することを伴う移行です。新しいモデルバージョン(バージョン5)を追加しようとすると、addPersistentStoreWithTypeを呼び出すとnilが返され、エラーは空のままになります。4から5への移行には、単一の属性の追加が含まれます。

私は問題のデバッグに苦労しており、次のすべてをチェックしました。

  1. ソースデータベースは実際にはバージョン4であり、persistentStoreCoordinatorの管理対象オブジェクトモデルはバージョン5です。

  2. 4-> 5マッピングモデルとバージョン4および5の管理対象オブジェクトモデルは、ビルドしたアプリケーションのリソースフォルダーにあります。

  3. さまざまなモデルのアップグレードパスを試しました。不思議なことに、初期バージョン3-> 5からのアップグレードは機能しますが、4->5からのアップグレードは失敗します。

  4. 属性が変更されているエンティティの移行用にカスタムエンティティ移行ポリシーを追加しようとしました...この場合、メソッドbeginEntityMapping:manager:error:をオーバーライドしました。興味深いことに、このメソッドは、移行が機能するとき(つまり、3から4、または3から5に移行するとき)に呼び出されますが、失敗した場合(4から5)には呼び出されません。

私はどこに進むべきかについてかなり途方に暮れています。この問題のデバッグに役立つアイデアをいただければ幸いです。

4

1 に答える 1

16

それが誰かを助ける場合に備えて、私はここで私自身の質問に答えています。

重要な問題は、オブジェクトモデルのバージョン4に到達したときに、プロジェクトに追加の管理対象オブジェクトモデルも追加したことです。この追加モデルは私のメインモデルとは別のものであり、別のスレッドでキャッシュを作成するために使用され、メインモデルとは関係のないデータが含まれています。

愚かなことに、私はまだmanagedObjectModelを使用して初期化しました

managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]

私の場合、メインモデルと他のモデルのエンティティを含むモデルを作成しました。これらの不要なエンティティのバージョンハッシュがデータベースにありました。次に、core-dataがこれらすべてのハッシュに一致するマネージドオブジェクトモデルを探しに行くと、当然それを見つけることができません。

私の場合、解決策は、移行前にdbファイルを手動でクリーンアップすること(不要なエンティティからversionhashesを削除すること)でした。次に、managedObjectModelの読み込みコードを次のように変更しました。

NSString *path = [[NSBundle mainBundle] pathForResource:@"MyDataModel" ofType:@"momd"];
NSURL *momURL = [NSURL fileURLWithPath:path];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];
于 2010-12-26T12:51:53.407 に答える