Realm Blog

Realm Java 1.1.0 — Insert APIを追加!

Realm Java 1.1.0をWebサイトBintrayでリリースしました。

Insert API

Realmのストレージエンジンは、データの挿入において常にSQLiteよりも高速に動作する性能を備えています。しかしRealm JavaのAPIデザイン上の制約により、ストレージエンジンの性能上のメリットはJavaのAPIからは生かせない状況が続いていました。

具体的には、1000以下のオブジェクトの一括作成においてはSQLiteと遜色のない性能が出ていましたが、これよりも多くのオブジェクトを一括作成しようとすると性能上の問題が発生します。

バージョン1.1.0ではこの問題を改善するため、新たに以下の4つのメソッドを追加しました。

  • void Realm.insert(RealmModel obj)
  • void Realm.insert(Collection collection)
  • void Realm.insertOrUpdate(RealmModel obj)
  • void Realm.insertOrUpdate(Collection collection)
Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
realm.insertOrUpdate(restApi.getPersons());
realm.commitTransaction();

これらのメソッドと従来から存在したRealm.copyToRealm()との大きな違いは、Realmに格納されたオブジェクトを返り値として返すかどうかです。返り値を省略することにより、オーバーヘッドとなっていたさまざまなチェックを省略出来るだけでなくオブジェクト作成処理における動的なメモリ割り当てを限りなくゼロに近づけることができます。

これまでは10万オブジェクトの一括作成においてSQLiteに比べて4割ほど遅かったものが、この改善によりSQLiteよりも1.7倍高速という結果を得ることができました。

Realm Batch Insert Benchmark

このベンチマーク結果を皆さんにも確認していただけるようにするため、ベンチマークコードのリポジトリを公開しました。上記のグラフの結果は、Android 6.0.1がインストールされたNexus 6P上の実行した際のものです。

Realmのauto-updateの機能を利用することで、オブジェクトの作成前にクエリを発行し作成完了時に通知を受け取ることができます。この機能はデータの表示と保存を分離する際にとても役に立ちます。

final PersonApi api = new PersonApi();
Realm realm = Realm.getDefaultInstance();
RealmResults<Person> persons = realm.where(Person.class).findAllAsync();
person.addChangeListner(new RealmChangeListener() {
    @Override
    public void onChange(RealmResults<Person> persons) {
      if (!persons.isEmpty()) {
	      // 作成完了時の処理を記述
      }
  }
});

realm.executeTransactionAsync(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
      realm.insertOrUpdate(api.getPersons());
    }
});

バグフィックス

Realm Java 1.1.0では、以下のものを含むさまざまなバグが修正されています。

  • 非同期トランザクションと非同期クエリをおなじLooperイベント内で使用した際、トランザクションで行われた操作を反映しない状態でonSuccess()コールバックが呼ばれてしまうバグを修正しました。

  • DexGuardの動作に支障があることが判明したため、1.0.1で導入されたRealmOptionalAPITransformerを一旦無効化しました。

詳細な変更点はchangelogを参照してください。


お読みいただきありがとうございます。 Realm で素晴らしいアプリケーションを作りましょう!お困りの際はStack Overflow(日本語)Slack(日本語)Twitter(日本語)GitHub(英語)でご相談ください。


Realm Team

At Realm, our mission is to help developers build better apps faster. We provide a unique set of tools and platform technologies designed to make it easy for developers to build apps with sophisticated, powerful features — things like realtime collaboration, augmented reality, live data synchronization, offline experiences, messaging, and more.

Everything we build is developed with an eye toward enabling developers for what we believe the mobile internet evolves into — an open network of billions of users and trillions of devices, and realtime interactivity across them all.

記事の更新情報を受け取る