29
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

realm-cocoa マイグレーション - RLMException が出てアプリが停止するときにファイルを消して対処する

Posted at

※これは iOS/Android モバイルデータベース Realm についての記事です。詳しくは以下をご参照ください。
Webサイト: realm.io、Facebookグループ: Realm Japan User Group、質問: Slack Channel

--

以下のように Xcode のコンソール画面に 'RLMException', reason: 'Migation' is required と出て、アプリが停止したときは以前実行したときと Realm モデルクラスのスキーマが変わっているためマイグレーションが必要となります。スキーマが変わったというのは、RLMObject を継承して定義したクラスのプロパティに何らかの変更があったということを指します。(名前変更を含む)

Migration_Exception.png

スキーマのカラムが増えた時

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)

対処法

  1. マイグレーションを実行する
    一つはマイグレーションを実行する方法があります。
    詳しくは公式ドキュメントのマイグレーションのセクションをご覧ください。

  2. Realm ファイルをスキーマの変更がある度に消す
    開発序盤であれば、スキーマが変更される頻度が高いので、変更がある毎に Realm ファイルを一度消すのも一つの方法です。

Realm ファイルの消し方(手動での消し方)

  1. AppDelegate などの適当な場所にブレークポイントをセットする
    AppDelegate_m.png

  2. アプリを実行させ、ブレークポイントで処理を止め、Xcode のコンソールで po RLMRealm.defaultRealmPath と入力する。すると defaultRealm までのパスが表示される。
    AppDelegate_m2.png

  3. 表示されたパスの末尾を default.realm を消し spotlight などで入力して Finder で Documents ディレクトリを表示させる。
    スクリーンショット_2015-07-11_13_43_59.png

  4. Finder で表示し、Realm 関連のファイルを全て消す
    Documents.png

  5. アプリを停止して再起動。これで、新しいスキーマの Realm ファイルが作成されます。

29
25
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?