2

CoreData アプリを既に出荷していますが、リリース 1 (バージョン 10) に到達する前に 9 つのモデルの古いバージョンを入手しました。最終的なモデルにつながる開発モデルの長いリストを削除したいと思います。

開発中に、myproject.xcodeproj の参照を削除し、mydata.xcdatamodeld の version_x.xcdatamodel ファイルも削除することで、これを簡単に実行できることがわかりました。

ただし、特に私のアプリが既にアプリストアにあることを考えると、考えられる欠点を調査しようとしています. 以前のバージョンからデータモデルを移行または復元する方法がないという事実を考慮して。

反対に、バージョン 11 と呼ばれるバージョン 10 に基づく新しいモデルを追加しました。このモデルで開発を行っています。移行のメカニズムはわかりませんが、なぜバージョン 10 より前のモデルが必要なのですか?

4

1 に答える 1

1

最初にデータ モデルの複数のバージョンを作成する主な理由は、既存のデータベースを削除して変更を加えた新しいデータベースを作成するよりも、移行 (データベースのアップグレード) をよりエレガントに処理することです。

したがって、以前のデータ モデルを使用する以前に出荷されたバージョンのアプリがあり、データベースをエレガントにアップグレードする機能が必要な場合は、以前のモデルをそのままにしておきます。

データ モデルの複数のバージョンを作成した唯一の理由が、初期開発中にデータをそのまま維持することであり、以前のデータ モデルを使用したアプリを他に誰も持っていない場合は、削除してください。それは問題ではありません。

データ モデルを自動的かつエレガントに移行するには、アプリ デリゲートで次のコードを使用します。

// Returns the persistent store coordinator for the application.
// If the coordinator doesn't already exist, it is created and the application's store added to it.
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"database.sqlite"]; //change to the name of your database

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);

        //[[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil]; --delete old model if necessary
        //abort(); --Abort App if necessary
    }

    return _persistentStoreCoordinator;
}
于 2013-05-14T00:06:24.973 に答える