Core DataでDBのMigrationを行う。

Core Dataで一旦作成してしまったテーブルに変更を行うとConflict Errorが発生してアプリがクラッシュしてしまいます。
App Storeに出す前の開発段階だと既存のsqliteファイルを削除してアプリを実行すれば、このクラッシュはとりあえず防ぐことはできますが、すでに既存のスキーマがプロダクションで動作している場合はそういうわけにもいきません。どうすればいいのでしょうか?

そんなときはCore DataのMigration機能を使いましょう。Migration機能を使うとDBに保存されているデータを保持したまま、テーブルの作成やカラムの変更を行うことが出来るようになります。

以下にMigrationの手順を示します。

(1/2) AppDelegateの修正

AppDelegate.swiftのpersistentStoreCoordinator…の箇所に以下の++のコードを追加してください。

    lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = {
           var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
           let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("medicalcheck.sqlite")
           var error: NSError? = nil
           var failureReason = "There was an error creating or loading the application's saved data."

            // optionsを追加

            ++ let options = [NSMigratePersistentStoresAutomaticallyOption: true,
            ++   NSInferMappingModelAutomaticallyOption: true]


           if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: options, error: &error) == nil {
               coordinator = nil
            ...

NSMigratePersistentStoresAutomaticallyOptionは自動的にMigrationを行うという意味で、NSInferMappingModelAutomaticallyOptionはMigrateされたDBを基に自動的にマッピングモデル(.xcdatamodel)のファイルを作成するという意味です。

これで AppDelegateの編集は完了です。

(2/2) 新しいModelのバージョンを作成

.xcdatamodelのファイルを選択して,変更したいEntitiyを選択します。次にMenu > Editor > Add Model Versionを選択します。 すると、新しいバージョン名を入力する画面が表示されますので新しいバージョン名を適当に入力してFinishを押します。

新しいバージョンが作成できたら、.xcdatamodeldの箇所に新しいバージョンのxcdatamodelファイルが作成できてますのでカラムを編集したり、Entityを編集してみましょう。

最後に右側のInspectorウインドウのModel Versionのcurrentの参照先を新しいバージョンに設定します。

Done!

Migration作業はこれで終わりです。 これでDBの変更を恐れずにガンガン開発できるようになります。

Related Contents

Pickup Contents