ActiveAndroidからOrmaへ移行した理由
- 2016.11.28
- Tech
- by Moyuru Aizawa

![orma]()
こんにちは。pairs事業部Androidエンジニアの愛澤(@lvla0805)です。
AndroidアプリケーションからSQLiteを扱う場合、SQLiteDatabaseクラスかORMapperを利用することになると思います。ORMよりもSQLiteDatabaseの方がパフォーマンスは優れていますが、文字列でDLL/DMLを記述しなければならないため扱いにくく、大規模なアプリケーションではORMapperを利用するのが一般的なのではないでしょうか。
恋愛・婚活マッチングサービス「pairs」では、ActiveAndroidというORMapperを利用していましたが、8月のアップデートからはOrmaへと移行しました。本稿では、なぜActiveAndroidからOrmaへ移行したのかを紹介します。
ActiveAndroid: https://github.com/pardom/ActiveAndroid
Orma: https://github.com/gfx/Android-Orma
Ormaを選んだ理由
パフォーマンス
ActiveAndroidは、リフレクションにより動的にCRUD処理を行います。リフレクションによる動的処理は、そうでない場合に比べてオーバーヘッドが大きく、SQLiteDatabaseを直接扱う場合に比べて圧倒的に処理速度で劣ります。
Ormaはアノテーションプロセッシングにより、コンパイル時にCRUDのコードを生成します。コンパイル時間は伸びまずが、リフレクションによる動的処理のようなオーバーヘッドはないため、SQLiteDatabaseを直接扱う場合と遜色ない処理速度です。
pairsでは初回起動時にマスターデータのINSERTが行われます。
![benchmark]()
ActiveAndroidでは平均1874msかかっていた処理がOrmaに移行することで、平均56msほどまで短縮されました。およそ3/100の短縮です!
クエリビルダ
Userテーブルから、id
が1
でname
がlvla0805
のレコードをSELECTする場合を例に、両ORMapperのクエリビルダを比べてみましょう。
new Select().from(User.class)
.where("Id = ? and name = ?", 1, "lvla0805")
.execute();
ActiveAndroidは、whereメソッドにWHERE句の文字列とプレースホルダーにあてはめる値を渡します。文字列にtypoがあってもコンパイルは通るため、実行時までバグに気づくことができない可能性があります。
ormaDatabase.selectFromUser()
.idEq(1)
.nameEq("lvla0805")
.toList();
一方、Ormaはコンパイル時にSELECT用のメソッドが生成されるので、文字列にバグが入り込むといった心配はありません。また、IDEの入力補完を利用できるのも非常に助かります。
マイグレーション
ActiveAndroidでマイグレーションを行う場合、マイグレーションファイルを用意してSQLを書く必要がありました。しかし、Ormaはカラムのリネーム以外は自動でマイグレーションしてくれるのが、素晴らしい点です。
ActiveAndroidの停滞
ActiveAndroidは、2014年10月のコミットを最後に開発が停止している状態です。そのため、pairsではRxJavaへ対応させたりなど独自のカスタマイズをしていました。
まとめ
新規開発でActiveAndroidを選択するのは得策とは言えないでしょう。現在利用している場合でもActiveAndroidがボトルネックになっているのであれば、Ormaへの移行を検討してみてください。
エウレカでは、一緒に働いていただける方を絶賛募集中です。募集中の職種はこちらからご確認ください!皆様のエントリーをお待ちしております!
- 2016.11.28
- Tech
- by Moyuru Aizawa
こんにちは。pairs事業部Androidエンジニアの愛澤(@lvla0805)です。
AndroidアプリケーションからSQLiteを扱う場合、SQLiteDatabaseクラスかORMapperを利用することになると思います。ORMよりもSQLiteDatabaseの方がパフォーマンスは優れていますが、文字列でDLL/DMLを記述しなければならないため扱いにくく、大規模なアプリケーションではORMapperを利用するのが一般的なのではないでしょうか。
恋愛・婚活マッチングサービス「pairs」では、ActiveAndroidというORMapperを利用していましたが、8月のアップデートからはOrmaへと移行しました。本稿では、なぜActiveAndroidからOrmaへ移行したのかを紹介します。
ActiveAndroid: https://github.com/pardom/ActiveAndroid
Orma: https://github.com/gfx/Android-Orma
Ormaを選んだ理由
パフォーマンス
ActiveAndroidは、リフレクションにより動的にCRUD処理を行います。リフレクションによる動的処理は、そうでない場合に比べてオーバーヘッドが大きく、SQLiteDatabaseを直接扱う場合に比べて圧倒的に処理速度で劣ります。
Ormaはアノテーションプロセッシングにより、コンパイル時にCRUDのコードを生成します。コンパイル時間は伸びまずが、リフレクションによる動的処理のようなオーバーヘッドはないため、SQLiteDatabaseを直接扱う場合と遜色ない処理速度です。
pairsでは初回起動時にマスターデータのINSERTが行われます。
ActiveAndroidでは平均1874msかかっていた処理がOrmaに移行することで、平均56msほどまで短縮されました。およそ3/100の短縮です!
クエリビルダ
Userテーブルから、id
が1
でname
がlvla0805
のレコードをSELECTする場合を例に、両ORMapperのクエリビルダを比べてみましょう。
new Select().from(User.class) .where("Id = ? and name = ?", 1, "lvla0805") .execute();
ActiveAndroidは、whereメソッドにWHERE句の文字列とプレースホルダーにあてはめる値を渡します。文字列にtypoがあってもコンパイルは通るため、実行時までバグに気づくことができない可能性があります。
ormaDatabase.selectFromUser() .idEq(1) .nameEq("lvla0805") .toList();
一方、Ormaはコンパイル時にSELECT用のメソッドが生成されるので、文字列にバグが入り込むといった心配はありません。また、IDEの入力補完を利用できるのも非常に助かります。
マイグレーション
ActiveAndroidでマイグレーションを行う場合、マイグレーションファイルを用意してSQLを書く必要がありました。しかし、Ormaはカラムのリネーム以外は自動でマイグレーションしてくれるのが、素晴らしい点です。
ActiveAndroidの停滞
ActiveAndroidは、2014年10月のコミットを最後に開発が停止している状態です。そのため、pairsではRxJavaへ対応させたりなど独自のカスタマイズをしていました。
まとめ
新規開発でActiveAndroidを選択するのは得策とは言えないでしょう。現在利用している場合でもActiveAndroidがボトルネックになっているのであれば、Ormaへの移行を検討してみてください。
エウレカでは、一緒に働いていただける方を絶賛募集中です。募集中の職種はこちらからご確認ください!皆様のエントリーをお待ちしております!