カスタムコアデータの移行を試みています。
古いデータモデルには、ステータス フィールドを持つ Contacts テーブルがあります。ここで、ステータス == 2 の場合、contacts テーブルのすべてのレコードに「Recommends」という別のテーブルを作成したいと考えています。Recommends テーブルの属性は、Contacts テーブルの属性とはまったく異なります。
これを行うにはどうすればよいでしょうか。
私が読んだことから、カスタムコアデータ移行ポリシーを使用してオーバーライドする必要があるようです
- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject*)src ¬
entityMapping:(NSEntityMapping*)map manager:(NSMigrationManager*)mgr error:(NSError**)error
しかし、やりたいことを達成するには複雑すぎるようです。現在、データモデルのバージョンは 15 です。1 から 14 までの以前のすべてのモデル バージョンのマッピング モデルを作成する必要がありますか? 次回はバージョン 20 で、ユーザーがバージョン 10 からバージョン 20 に直接更新した場合、この移行ポリシーもトリガーされますか? 何か問題が発生した場合に何が起こるかをテストすることは非常に困難です。
別の方法を試しました - storecoordinator を初期化するときは、次を使用します。
NSManagedObjectModel *destinationModel = [self managedObjectModel];
// Migration is needed if destinationModel is NOT compatible
BOOL isMigrationNeeded = ![destinationModel isConfiguration:nil
compatibleWithStoreMetadata:sourceMetadata];
if (isMigrationNeeded) {
self.needMigration = YES;
DDLogInfo(@"Migration needed");
NSArray* sourceVersionIdentifiers = [sourceMetadata objectForKey:NSStoreModelVersionIdentifiersKey];
self.sourceMigrationVersion = [sourceVersionIdentifiers lastObject];
DDLogInfo(@"Source Version:%@",self.sourceMigrationVersion);
NSSet* destVersionIdentifiers = [destinationModel versionIdentifiers];
self.destMigrationVersion = [destVersionIdentifiers anyObject];
DDLogInfo(@"Destination Version:%@",self.destMigrationVersion);
}
- (NSDictionary *)sourceMetadata:(NSError **)error
{
return [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType
URL:[self storeURL]
error:error];
}
基本的に、古いモデルと新しいモデルのデータモデル バージョンを比較し、特定のバージョンに移行していることを検出した場合は、別の場所でカスタム コードを実行しようとします。
問題は、古いデータモデル バージョンの一部にバージョン識別子がないことです。今追加しても、ソース メタデータには表示されません。モデルからストアを作成するときに明示的に設定する必要があると思いますか?
もう 1 つの方法は、上記のすべてを無視して、移行が実行されたときにフラグを設定して保存し、起動時に毎回フラグを確認することです。しかし、それは私にはあまりきれいに聞こえません。
アイデアはありますか?