Realm Blog

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'
}

将来的にはRecyclerViewCursorのような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(英語)でご相談ください。


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.

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