※これは iOS/Android モバイルデータベース Realm についての記事です。詳しくは以下をご参照ください。
Webサイト: realm.io、Facebookグループ: Realm Japan User Group、質問: Slack Channel
--
以下のように Xcode のコンソール画面に 'RLMException', reason: 'Migation' is required
と出て、アプリが停止したときは以前実行したときと Realm モデルクラスのスキーマが変わっているためマイグレーションが必要となります。スキーマが変わったというのは、RLMObject
を継承して定義したクラスのプロパティに何らかの変更があったということを指します。(名前変更を含む)
スキーマのカラムが増えた時
2015-07-11 13:04:32.142 ASNFindMovie[10892:356134] *** Terminating app due to uncaught exception 'RLMException', reason: 'Migration is required for object type 'ASNProduct' due to the following errors:
- Property 'hoge' has been added to latest object model.'
上記のようなエラーメッセージは、「ASNProduct
クラスに hoge
プロパティが追加されたからマイグレーションが必要です」という意味です。
スキーマのカラムが減った時
2015-07-11 13:01:41.641 ASNFindMovie[10724:352635] *** Terminating app due to uncaught exception 'RLMException', reason: 'Migration is required for object type 'ASNProduct' due to the following errors:
- Property 'hoge' is missing from latest object model.'
上記のようなエラーメッセージは、「ASNProduct
クラスに hoge
プロパティが見当たらないからマイグレーションが必要です」という意味です。
なぜマイグレーションが必要か?
Realm はデータベースであり、それまでに使っていたスキーマのデータが Realm ファイルに保存されています。スキーマを変えてしまうと、今まで保存されているデータが新しい変更後のスキーマに対応できなくなり、新しいスキーマに対応させるためにマイグレーション処理が必要となります。
データが一つも保存されていない場合でも Realm ファイルが存在していれば、スキーマの書き込みが行われ、Realm を呼び出し時に、今定義されているスキーマと以前使っていたスキーマが整合性が取れているのかチェックされますので、マイグレーションは必要となります。
公式ドキュメントのマイグレーションのセクションにも説明が記述されています。
公式ドキュメント(日本語) - realm-cocoa マイグレーション(Objective-C)
公式ドキュメント(日本語) - realm-cocoa マイグレーション(Swift)
対処法
-
マイグレーションを実行する
一つはマイグレーションを実行する方法があります。
詳しくは公式ドキュメントのマイグレーションのセクションをご覧ください。 -
Realm ファイルをスキーマの変更がある度に消す
開発序盤であれば、スキーマが変更される頻度が高いので、変更がある毎に Realm ファイルを一度消すのも一つの方法です。