Realm Blog

Realm Java 3.4 - 逆方向の関連に対するクエリーとデータ同期進捗リスナーをサポート

本日、Realm Java 3.4をリリースしました。今回のリリースでは、逆方向の関連に対するクエリーのための機能とデータ同期の進捗に対するリスナーのサポートが追加されました。これらについて詳しく解説していきます。

逆方向の関連に対するクエリー

Realm Java 3.1では、新機能として@LinkingObjectsアノテーションを使った逆方向の関連をベータ版としてリリースしました。今回のバージョン3.4では、この逆方向の関連をRealmListRealmObjectと同じようにクエリー中で使用できるようにしました。

public class Person extends RealmObject {
   public String name;
   public Dog dog;
}

public class Dog extends RealmObject {
   public String name;
   @LinkingObjects
   public final RealmResults<Person> owners = null;
}

// RealmListと同じように、逆方向の関連を使ったクエリー
Person owner = realm.where(Dog.class).equalTo("owners.name", "Jane").findFirst();

@LinkingObjectsに対するクエリーはRealmListに対するこれまでのリンククエリーと同じように使うことができます。また、この機能が実装されたことにより@LinkingObjects機能はベータ版としての位置づけを終え、正式版なAPIとして取り扱われます。

データ同期進捗リスナー

Realm Mobile Platformが提供するオフラインファーストのための機能により、行った変更はネットワークの状態にかかわらず即座にローカルなRealmへ適用されます。ネットワークが利用可能になると、バックグラウンドで自動的にデータの同期が行われ、サーバーと他のデバイスに変更が伝搬します。このことにより、Realm Drawのようなリアルタイムに協調動作をするアプリケーションを作ることができます。

このように自動的に行われるデータ同期ですが、場合によっては同期すべきデータがどの程度残されているかを把握したい場合もあります。たとえば、アプリの初回起動時に、表示に必要なデータの同期がどの程度で完了するかを表示するような場合や、初回起動時に限らず、同期のプログレスバーを表示することでデータ同期中であることをユーザーに伝えるような場合です。

これらを実現できるようにするため、ProgressListenerSyncSessionに対して登録することでデータ同期の進捗状況を取得できるようにAPIを拡張しました。

Realm realm = Realm.getInstance(config)
writeData(realm);
SyncSession session = SyncManager.getSession(config);

// Realmに書き込んだイメージデータのアップロードのプログレスを表示
showProgressBar();
session.addUploadProgressListener(ProgressMode.CURRENT_CHANGES, new ProgressListener() {
   @Override
   public void onChange(Progress progress) {
       if (progress.isTransferComplete()) {
           hideProgressBar();
           session.removeProgressListener(this);
       } else {
           updateProgressBar(progress.getFractionTransferred());
       }
   }
});

// サーバーからのダウンロードが発生するたびにダウンロード中を示すUIヒントを表示
session.addDownloadProgressListener(ProgressMode.INDEFINITELY, new ProgressListener() {
   @Override
   public void onChange(Progress progress) {
       showDownloadingChanges(!progress.isTransferComplete());
   }
});

注意点としては、現時点ではプログレスリスナーを登録できるのはRealmインスタンスがオープンされている間だけに限られているという点です。

本バージョンでの変更の一覧は、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.

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