こんちには、フリーの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)にはない概念なのでこういう仕組みにはちょっと驚きますね。
コメント