Realm Java 0.90 — Better Date and API Cleanup!
Realm Javaの最新版をwebサイトとJCenterでリリースしました。
このリリースで、Date
型のミリ秒精度のサポートとAPIクリーンアップが行われました。
Date型の精度改善
Realm Javaがjava.util.Date
型をサポートし始めた当初から1つの制限事項がありました。それは時刻の情報を秒の精度に丸めてしまうというものです。
この制限が導入されたのはすべてのRealmプロダクト間で互換性を保つためでしたが、Realm Java 0.90及びRealm Objective-C & Swift 0.101からはこの制限を撤廃し、Date
型が提供するミリ秒精度の日時情報をRealmでも扱えるようにしました。
この変更はRealmファイルのフォーマット変更を伴いますが、Realm Java 0.90以降でファイルを開いた場合は自動的にフォーマット変換が行われるため通常はアプリケーション開発者が気にする必要はありません。
ミリ秒精度のDate
型をぜひご活用ください。
Android Adapters
0.90から、Android特有のコンポーネントを別のリポジトリに移します。このことにより、機能拡張やバグ修正のリリースがRealm本体とは独立して行えるようになるだけでなく、ライブラリ本体のサイズも小さくすることができます。
この変更によりRealmBaseAdapter
はRealm本体には含まれなくなるため、継続して使用するためには以下の依存を追加する必要があります。
dependencies {
compile 'io.realm:android-adapters:1.0.1'
}
将来的にはRecyclerView
やCursor
のようなAndroid固有の機能をサポートするクラスを提供する予定です。これら以外にもサポートしてほしいコンポーネントの要望がある場合は、Realm Android Adaptersリポジトリーにissueを作成してください。
APIクリーンアップ
Realm Javaがベータになってからおよそ1.5年が経過しましたが、その間にAPIに関するさまざまなフィードバックをいただきました。これらのフィードバックをふまえ、APIの削除や変更を行いました。
APIの変更のうち重要なものを以下に列挙します。
-
すべてのAPIのクラスを
final
にしました。 -
RealmChangeListener
は、変更対象のオブジェクトをonChange()
の引き数で受け取れるようになりました。
realm.addChangeListener(new RealmChangeListener<Realm>() {
@Override
public void onChange(Realm realm) {
// Realmの参照を受け取ることができます。
// Realmのオブジェクトは自動的に更新されるため、このメソッド内で取得した
// オブジェクトの持つ値と、別の場所で保持しておいた同一のRealmオブジェクト
// の値を比較することは意味がありません(すべて最新の値に更新されます)。
// すべて最新の状態に更新されるので
}
});
Person p = realm.where(Person.class).findFirst();
p.addChangeListener(new RealmChangeListener<Person>() {
@Override
public void onChange(Person person) {
person.getName(); // 更新のあったPerson
}
});
-
Realm
およびDynamicRealm
上のクエリ系のメソッド(allAbject*()
およびdistinct*()
)を非推奨にしました。これらの機能を使用する場合はRealm.where()
、DynamicRealm.where()
、RealmCollection.where()
から取得できるRealmQuery
オブジェクトのメソッドを使用してください。 -
RealmConfiguration.Builder.setModules()
はRealmConfiguration.Builder.modules()
にリネームされました。 -
Realm.waitForChange()
が新たに導入されRealm.refresh()
は非推奨になりました。Realm.waitForChange()
の使い方についてはこのgistを参照してください。
この変更はワンタイムのタスクは非同期APIを使用するか、必要に応じてRealmインスタンスをオープンし完了したら即座にcloseするかのいずれかであるべきという理由で採用されました。
waitForChange()
は、Looperスレッドではない場合のように、非同期APIが利用できないユースケースで利用に適しています。
waitForChange()
メソッドは、現状のデータに対する変更が発生するかstopWaitForChange()
が呼び出されるまで呼び出しスレッドをブロックします。
完全な変更内容一覧と詳細はchangelogから参照することができます。
お読みいただきありがとうございます。Realmが素晴らしいアプリの実装のお役に立てれば嬉しく思います。お困りの際はStack Overflow(日 本語)、Slack(日本語)、Twitter(日本語)、GitHub(英語)でご相談ください。