このページを正しく表示するにはJavascriptを有効にしてください。
Android用の新しいORMライブラリ Ollie を使う
Androidのデータベースを簡単に扱える「Ollie」というライブラリを使ってみました。
今まではActiveAndroidを利用していたのですが、パフォーマンス的にあまり早い方ではないらしく乗り換えを検討していました。(といっても体感レベルで遅いと感じたことはないですが。)
このOllieというライブラリはActiveAndroidと同じ作者が作成しているため、乗り換えコストが低いだろうと思い使ってみました。
[https://github.com/pardom/Ollie](https://github.com/pardom/Ollie)
## インストール
AndroidStudioを利用している場合、 ```app/build.gradle``` のdependenciesに
```
compile 'com.michaelpardo:ollie:0.3.1'
provided 'com.michaelpardo:ollie-compiler:0.3.1'
```
を追加してSyncします。
またandroid-aptのセットアップがまだであれば
```
apply plugin: 'android-apt'
```
を ```apply plugin: 'com.android.application'```の下に追加します。
これでライブラリの設定は完了です。
## 使い方
### DB初期化
```
Ollie.with(getApplicationContext())
.setName("test.db")
.setVersion(1)
.setLogLevel(Ollie.LogLevel.FULL)
.init();
```
こんな感じのDB初期化コードを呼んであげます。
独自Applicationを作ってそこに初期化コード書いておくと確実ですが、ちょっと試す程度であれば最初に呼ばれるApplicationのonCreateとかに書いといても大丈夫です。DBを操作する前に呼ばれていれば多分問題ありません。
### モデルを作る
次にモデルクラスを作ります。
```
@Table("notes")
class Note extends Model {
@Column("title")
public String title;
@Column("body")
public String body;
}
```
サンプルだとこんな感じ。これがSQLiteのテーブル構造にもなります。この辺はActiveAndroidと一緒ですね。
@Tableがこれがデータベースで管理するモデルである事を示すアノテーションで、引数がテーブル名になります。同様に@Columnがカラムを示すアノテーションです。他の引数に何が使えるかはまだ調べてません。ドキュメントがないのでテストコード読んだり、実ソース読んだりする必要がありそうです。ちょっと見た感じでは、モデルをさらに継承して違うテーブルを作るみたいなのも出来そうです。
データベースはこのクラスを元に自動的に作られるので、このModelの構造を変えるときは注意が必要です。開発時にはアンインストールしてDBごと消せば問題無いですが、リリース後モデルの構造を変えたい場合は適切なマイグレーションコードを書く必要があります。マイグレーションの仕方もActiveAndroidに似ていて自分でSQLコードを埋め込む仕様っぽいです。この辺は他のORMと比べると弱いですね。
### データを保存してみる
モデルを定義してアプリをビルド・実行するとSQLiteのデータベースがすでに出来上がっています。CREATE TABLEとか一切要らないのが便利ですね。早速このデータベースにデータを保存してみましょう。
```
Note note = new Note();
note.title = "Test";
note.body = "Hello Ollie";
note.save();
```
インスタンスを作って、save()を呼び出してあげれば保存が完了します。すごく簡単ですね。
save()を呼ぶとnote.idにテーブルにキーが割り当てられます。なので同じインスタンスに対して何度saveを呼んでも別のレコードが挿入されることなくnoteを更新できるようになってます。
### データを取り出してみる
保存したものを今度は取り出してみます。
```
List
notes = Select.from(Note.class).fetch();
```
これですべてのノートを同期的に取り出せます。必要に応じてwhereだったりlimitだったりをチェーンすることも出来ます。ここでもまだドキュメントがないのでテストコードを漁りましょう。
1レコードのみ取り出したい場合は
```
Note note = Select.from(Note.class).fetchSingle();
```
で取り出せます。
同期的にDB操作するのが嫌だという場合は、fetchの代わりにobservableというメソッドを使えば非同期的で受け取り処理を書くことも出来るみたいです。
## 所感
まだ新しいライブラリなのでどれだけの事が出来るかは未知数ですが、データベースをこれだけ簡単に扱えるライブラリはとても魅力です。ActiveAndroidからの追加学習コストもほとんどなく、パフォーマンスの改善効果が受けられる(らしい)ので、このまましばらく使ってみたいと思います。
## 参考
[天下一「AndroidのORM」武道会](http://qiita.com/pside/items/ba7f8fcbd304d702eda6)
Android向けORMの速度比較。残念ながらOllieは動かなかったようでベンチの対象にはなってません…。