ほげほげ(仮)

仮死状態

ObjectBox所感

greenrobotが新しいmobile object databaseのObjectBoxのBetaをリリースしたようです。

ObjectBox - The new Mobile Database (Beta) - Open Source by greenrobot

greenrobotは、EventBusgreenDAOを作ったとこです。

AndroidにおいてはRealmと競合になりそうな感じですかね。

機能

アナウンスの記事を見ると5つの機能をアピールしてますね。

  • Superfast
  • Object API
  • Instant unit testing
  • Simple threading
  • No manual schema migrations

ちょっと試してみた

ちょっと試して、Realmとの比較してみました。

セットアップは省略。

Entity

次のようなPOJOクラスを設定してアノテーションを指定します。とりあえず、書くのはこれだけです。

@Entity
public class Note {

    @Id
    private long id;

    private String text;

    private String comment;

    private Date date;
}

これをビルドすると、次のように勝手に色々生成されます。コンストラクタとgetter/setterですね。

f:id:STAR_ZERO:20170125180545g:plain

これはaptでよくあるbuild/generatedにコードを作るのではなく直接コードが変更されます。ちょっとこれは怖いかも…

あとは、app/objectbox-models/default.jsonが作成されます。スキーマ情報ですかね。

Insert

Insertはすごく簡単でEntityのインスタンスを作ってBoxというオブジェクトに入れるだけです。

Note note = new Note(0, "text", "comment", new Date());
notesBox.put(note);

idを0にするとAutoIncrementで自動で採番してくれます。Realmには無い機能なのでこれは地味に嬉しいかも。

あと、Realmと違ってTransactionで囲む必要が無いですね。

Update

Updateはidを既存のもにすると更新されますね。他はInsertと同じです。

Delete

削除はidを指定するだけです。他にもEntityをそのまま渡しても削除できます。

notesBox.remove(1);

全件削除も簡単です。

notesBox.removeAll();

Realmの場合は一度Queryで取得してから削除になるので、ここも違いますね。

Query

クエリも単純です。

QueryBuilder<Note> builder = notesBox.query();
List<Note> notes = builder.build().find();

条件指定

QueryBuilder<Note> builder = notesBox.query();
Query<Note> query = builder.equal(Note_.id, 2).build();
List<Note> notes = query.find();

このあたりはRealmとそこまで変わらないですが、カラムの指定がRealmは文字列に対して、ObjectBoxは定数みたいなのが使えます。

test

Gradleのほうで、次のように書いてSyncすると勝手にテストの雛形みたいなのが出来ます。

objectbox {
    generateTests true
}

テスト用のsetupとかはありがたいかもしれないですね。

auto migration

Entityに追加したり、削除したりすると自動でマイグレーションしてくれます。これはかなり強力な気がします。

Entityにフィールドを追加してビルドしたら、勝手にまた色々追加されました。逆に削除したらコンストラクタは変更されたけど、getter/setterは残ってしまいました(バグかな?)

既存レコード側の影響としては、追加されたフィールドは初期値が設定されるみたいで、Stringがnullでintなら0でした。このあたりは制御できるのかな?

さすがに型をStringからintのように変更するのはダメでした。

まとめ

個人的な感想として、軽く触ってみた感じ、だいぶ使いやすい印象でした。

一番ネックになるのがEntityクラスがビルド時に書き換わることかなぁと。ただ、ここを頻繁にいじることがなければ許容範囲かなって気もしますが、どうでしょうかね…

Betaだし、ObjectBrowserも無いので(issueはここ)、まだまだ実際に使うことはないですが期待したいです。