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(英語)でご相談ください。