【Swift】Realmでテーブル定義を変更した際のマイグレーション方法

Swift

こんちには、フリーのITエンジニアでWeb(PHP:Laravel)のバッグエンドをメインにフルリモートでお仕事させて頂きながら、個人開発でiOSアプリを作っているMoritaです。

SwiftでRealmを使用していて、カラムを新規追加した際のエラー解決方法です。

Realmのスキーマを変更した場合、マイグレーションが必要

一度Realmでテーブルを作成した場合、スキーマ情報とバージョンが記憶されているようで、同じバージョンでカラムの追加・変更なのでスキーマ情報を変更した場合、
Realmが読み込まれる前にバージョンを上げてマイグレーションする必要があります。

バージョンを上げてマイグレーションさせる方法

スキーマ情報の変更でマイグレーションする場合、特に難しい作業をする必要はありません。Realmが読み込まれる前(AppDelegeteのdidFinishLaunchingWithOptionsかSceneDelegeteのsceneメソッドの中)に以下の記載をするだけです。

// application(application:didFinishLaunchingWithOptions:)の中に書きます

let config = Realm.Configuration(
  // 新しいスキーマバージョンを設定します。以前のバージョンより大きくなければなりません。
  // (スキーマバージョンを設定したことがなければ、最初は0が設定されています)
  schemaVersion: 1,

  // マイグレーション処理を記述します。古いスキーマバージョンのRealmを開こうとすると
  // 自動的にマイグレーションが実行されます。
  migrationBlock: { migration, oldSchemaVersion in
    // 最初のマイグレーションの場合、`oldSchemaVersion`は0です
    if (oldSchemaVersion < 1) {
      // 何もする必要はありません!
      // Realmは自動的に新しく追加されたプロパティと、削除されたプロパティを認識します。
      // そしてディスク上のスキーマを自動的にアップデートします。
    }
  })

// デフォルトRealmに新しい設定を適用します
Realm.Configuration.defaultConfiguration = config

// Realmファイルを開こうとしたときスキーマバージョンが異なれば、
// 自動的にマイグレーションが実行されます
let realm = try! Realm()

Realmの正式ドキュメントにも記載があります。
こちらではAppdelegate内に書くとありますね。

schemaVersionがデフォルトでは0らしいので、変更した際にバージョンを上げる必要があります。(1と記載されているところの数字を上げていきます。)

まとめ

初めてRealmを使用した時はエラーの理由が分からずに困惑しました。
今までのデータベース(SQLite、Mysql、SQLServer)にはない概念なのでこういう仕組みにはちょっと驚きますね。

コメント

タイトルとURLをコピーしました