4

sqlite データベースを Dropbox にバックアップするコアデータ アプリがあり、ユーザーは必要に応じて現在のデータベースを上書きして復元できます。

次のアプリ リリースでは、コア データ モデルが変更され、既存のユーザーのデータベースは、軽量の移行プロセスを通じて自動的に更新されます。

私の懸念は、すでにバックアップされているデータベースにあります。ユーザーが移行前にバックアップされた sqlite データベースを復元しようとすると、最新のモデルと一致せず、アプリがクラッシュします。

コア データ モデルに一致するように、復元プロセス中にデータベースを更新する方法はありますか? 実行できるプロセス、またはバックアップが失われないことを確認するために実行できるいくつかの手順のいずれか?

4

2 に答える 2

1

コア データを含む sqlite データベースを開くと、軽量の移行が自動的に行われます。ほとんどの場合、アプリケーションの更新の一環として発生しますが、復元されたデータベースを開いた場合にも発生します。

復元後に移行が必要かどうかを確認するチェックを追加できます。

-(BOOL) storeRequiresMigration: (NSURL *) storeURL {
NSError *error = nil;
NSPersistentStoreCoordinator * temporaryPersistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

//Check if migration is needed
NSDictionary *sourceMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType URL:storeURL error:&error];
NSManagedObjectModel *destinationModel = [temporaryPersistentStoreCoordinator managedObjectModel];
BOOL isCompatibile = [destinationModel isConfiguration:nil compatibleWithStoreMetadata:sourceMetadata];
NSLog(@"Store requires migration: %d", !isCompatibile);
return !isCompatibile;

}

于 2014-01-20T12:29:37.503 に答える
0

以前のデータ モデル バージョンをアプリに保持している限り、このプロセスは軽量移行によって処理されます。あなたの質問から判断すると、これはまさに軽量の移行が処理するものだと思います。以前のデータ モデル バージョンからの変更を推測し、古いデータを新しいデータ モデルにマッピングします。

データ モデル内の名前を変更したいという特殊なケースでは、"Versioning" の下のインスペクターにある Renaming ID を使用して行うことができます。

于 2012-09-13T04:14:01.723 に答える