Realm Blog

Mobile Platform Supportを追加したRealm Java 2.0をリリースしました

本日、Realm Mobile Platformなどの新機能を含んだRealm Java 2.0をリリースしました。

Realm Mobile Platform拡張

Realm Mobile Platformの リリースについてのお知らせをご覧になっていない方は先にそちらをお読みいただき、その後このエントリでAndroidに関する詳細を確認していただければと思います。

Realm JavaでRealm Mobile Platform拡張を使用するためには、アプリのプロジェクトのbuild.gradleファイルで以下のように有効化します。

realm {
  syncEnabled = true
}

それではデバイス間同期を有効にしたRealmの設定方法を見ていきましょう。

// ログイン
Credentials creds = Credentials.usernamePassword(username, password, true);
User.loginAsync(creds, "https://realm.example.com:9443", new User.Callback() {
  @Override
  public void onSuccess(User user) {
    // Opening a remote Realm
    // このRealmインスタンスに対するすべての変更は自動的にデバイス間で同期されます。
    SyncConfiguration config = new SyncConfiguration.Builder(user, "realm://realm.example.com/~/userRealm").build();
    Realm realm = Realm.getInstance(config);
  }

  @Override
  public void onError(ObjectServerError error) {
    // エラー処理
  }
});

たったこれだけです。このようにRealmをオープンすることで、同じユーザー情報を使用するすべてのデバイス間で自動的に変更が同期されます。

さらに詳細に見ていきましょう。Realm Mobile Platformをサポートするために、APIにいくつかのクラスを追加しています。

User & Credential

ユーザーは同期するRealmではとても重要な概念です。同期するすべてのRealmはユーザーに関連付けられます。ユーザーはユーザー名とパスワードだけでなく、Google、Facebook、iCloudなどにより認証することができます。詳細についてはドキュメントを参照してください。

Sync Configuration

SyncConfigurationクラスを用いることで、ユーザーとサーバーのURL(例: realm://realm.example.com/~/userRealm)を指定してRealmインスタンスを取得することができます。詳細についてはドキュメントを参照してください。

Sync Manager & Session

SyncManagerはすべての同期するRealmを管理するシングルトンです。現時点では共通のエラーハンドリングのために使用します。

同期するRealmはそれぞれがSessionを持ちます。Sessionを通して、同期に関する状態の情報にアクセスできます。Sessionには今後も有用な情報を追加していく計画です。

Realm Mobile Platform拡張はベータ版です

Realmの同期機能は長い時間をかけて開発された安定した基盤の上に構築されています。Realm Mobile Platformの拡張APIについてはより使いやすいものに改善していくため、現時点ではベータ版として提供することにしました。そのため、APIは将来のリリースで変更される可能性があります。

Realm Mobile Platformの拡張APIを使用しない場合は、これまで通りのスタンドアローンのRealmとして利用することができます。

拡張APIはスタンドアローンのRealmのものとは明確に区別されて設計されているため、アプリがベータ版の拡張APIに依存しているどうかはかんたんに把握することができます。

すべてのベータ版APIにはコードおよびJavadocに@Betaタグがつけられています。

2.0でのその他の変更点

本リリースはメジャーバージョンアップなので、さまざまな新機能がふくまれています。また同時に、Realm SwiftやRealm Objective-Cとより親和性を高めるための変更も含まれます。

パフォーマンス改善といくつかのバグ修正のため、本リリースではファイルフォーマットが変更されています。Realm Java 2.0以降で読み書きされたデータベースファイルは1系のバージョンでは読むことができません。以前のバージョンのファイルを2.0以降から読み書きする際には自動的に新ファイルフォーマットに移行されます。

注意: 事前に作成されたRealmファイルをアプリとともに配布している場合は、新しいファイルフォーマットへ変換してください。変換にはRealm Browserを使用することができます。

Global initializer

Realm JavaにContextを必要とするAPIがだんだんと増加していました。ContextがAPIの使い勝手を悪くしてしまう部分があったため、2.0ではグローバルな初期化APIを追加し、そこでのみContextを要求するように変更しました。

Realm.init(context)`

この変更により、さまざまなAPIで引き数からContextが削除されています。この点に関するAPIの変更は以下のとおりです。

  • RealmConfiguration.BuilderのコンストラクターからContextを削除しました。
  • RealmConfiguration.Builder.assetFile()からContextを削除しました。
  • Realm.getDefaultInstance()はデフォルトのRealmConfigurationをセットすることなく呼び出すことができるようになりました。
  • ネイティブコードの読み出しがより安定したものになりました。

グローバルな初期化は、Applicationのサブクラスで行うように実装するのが自然です。

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Realm.init(this);
        // その他の初期化処理
    }
}

デフォルト値

Realm Java 2.0では、オブジェクト作成のさいのデフォルト値がサポートされました。これは、以下のようにモデルクラスを定義する際にフィールドやデフォルトコンストラクタで値を指定できることを意味します。

public class Person extends RealmObject {
  private String name = "John";
  private int age;

  public Person() {
    this.age = 42;
  }
}

Person p = realm.createObject(Person.class);
p.getName(); // John
p.getAge(); // 42

デフォルト値はJSONからオブジェクトを作成する際にも適用されますが、dynamic APIを用いる場合には適用されません。

RealmLog

RealmLogクラスがAPIに追加されました。このクラスは、どの程度のログが出力する、またどのようにログを出力するかを制御することができます。Realm Mobile Platformに関するログも、全てこのクラスを通じて制御可能です。

RealmLog.clear(); // すべてのロガーを削除
RealmLog.add(new AndroidLogger(Log.DEBUG)); // 独自のロガーを追加

プライマリキーの扱いについて

デバイス間のデータ同期をサポートするため、プライマリキーに関する以下の2つの制約が新たに追加されています。

1) オブジェクトの作成の際に、必ずプライマリキーの値を指定することが必要。 2) 一旦セットされたプライマリキーの値は変更できない。

1つ目の制約は、realm.createObject(Class)に関係するものです。プライマリキーが定義されたモデルクラスのオブジェクトを作成する際は、realm.createObject(Class, Object)を使用してプライマリキーの値を指定する必要があります。

realm.copyToRealm()realm.createObjectFromJson()は従来通り使用することができます。

もし何らかの理由でプライマリキーの値を変更する必要がある場合は、変更後のプライマリキーの値を持つ新たなオブジェクトを作成し、フィールドの値をコピーする必要があります。その際、copyFromRealm()/copyToRealm()の利用を検討してください。

バグフィックスおよびその他の変更点

変更やバグフィックスの完全なリストは 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.

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