ActiveAndroidからOrmaへ移行した理由

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テーブルから、id1namelvla0805のレコードを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への移行を検討してみてください。

  • このエントリーをはてなブックマークに追加

エウレカでは、一緒に働いていただける方を絶賛募集中です。募集中の職種はこちらからご確認ください!皆様のエントリーをお待ちしております!

Recommend

goji+xorm: Building web api server in golang (part1)

Swift3.0でJSONを厳しく安全に扱えるライブラリを作りました