次世代モバイル向けデータベースRealmを使ってみる 第3回- Realm Javaを使ってみた-
skill

次世代モバイル向けデータベースRealmを使ってみる 第3回
- Realm Javaを使ってみた-

2015.11.05

ent127_img01.jpg

前回までのRealm Cocoa、Realm Swiftに続き、今回は3つ目のRealmプロダクトであるRealm Javaを紹介しよう。また、後半にはRealm Japan meet upの様子を紹介し、最新のRealmの動向をお伝えして本連載を終えたい。
繁田 卓二

■概要

Android開発においては古くからSQLiteが公式にサポートされていたが、クエリビルダやORマッパーなどは用意されておらず、文字列としてのSQLクエリで手続き的にデータをやりとりすることになり、オブジェクトへのマッピングなども全て開発者が自前で用意する必要があった。もちろんActiveAndroidをはじめ、多くのサードパーティ製のライブラリなどでオブジェクティブな実装は可能であったが、やはり導入の敷居の高さやパフォーマンス面のボトルネックが問題となる事が多かった。Realm Javaはこれらの問題を解決する手段として注目されている。

■Realm Java

Realm Javaと言ってもJava環境全てで使えるわけではなくAndroid環境に特化(※1)したライブラリという扱いとなる。Android Studioを推奨としているが、最低動作バージョンを表すAPI Levelも9以降、と比較的古い環境でも動作するのは嬉しいところだ。

(※1 公式サイトには「at the moment.」と将来的なサポートを匂わす一文が書かれている)

インストールや基本的な動作については公式サイトに詳しい情報が記載されているのでそちらを参考にしていただきたい。

・Realm公式ドキュメント
https://realm.io/jp/docs/objc/latest/

■モデルクラスの概要

ではまず、Realm Javaで記述したモデルクラスとRealm Swiftのモデルクラスを比較してみよう。下記は前回のAlbumモデルと同じ実装をRealm Javaで実装したものだ。

ent127_img02.jpg

まず違いとして大きく目立つのはプロパティへのアクセサ宣言部があることだ。Realm CocoaとRealm Swiftではアクセサ宣言を書く必要は無い。ただこれはiOSの仕様上アクセサが暗黙的に定義されるというだけであり、内部的にはあまり違いは無い。実装手順としてはアクセサメソッドを手書きする必要があるというだけだが、これはAndroid Studioを使用していれば自動生成できるためそれほど手間ではないだろう。
その他、細かな言語仕様の違いはあれども、コードを読めば同じ構成であることは理解できるだろう。iOSとAndroid間での設計の共有がしやすくなるというメリットは非常に大きい。

■実装上の特徴

とは言え、異なる言語で完全に同じ記述というわけにはいかず、言語の壁を超えることのできない仕様もある。Realm Javaでは言語間の差異を無理に統一しようとせず、それぞれの言語の仕様や作法をうまく活かしたインタフェースが実装されている。そのいくつかを紹介しよう。

■アノテーションを使用した制約定義

プロパティのデータベース制約、例えばプライマリキーやnull許可などの制約はアノテーションで定義することが可能だ。iOSにはアノテーションという概念が無いため、プライマリキーのプロパティ名を文字列で返すテンプレートメソッドを自前で定義する必要があった。アノテーションで記述できるのは無駄なメソッドを書く必要が無く、モデルクラスの見通しも良くなるだろう。

アノテーションは下記の4つが使用可能だ。制約を付けたいプロパティ宣言部の直前行に記述しよう。
@PrimarKey?????プライマリキー制約。ユニーク値であることを保証する。
@Required???????Not Null制約。Javaのプリミティブな値はnullを代入できないため宣言不要。
@Index????????????プロパティ値がインデックス化され検索パフォーマンスを向上する。
@Ignore???????????宣言されたプロパティはデータベースに保存されなくなる。

ent127_img03.jpg

■独自のクエリビルダ

Realm Cocoa/SwiftではPredicateという述語オブジェクトが古くかあり、それをうまく利用した仕様になっているが、Realm Javaでは独自のクエリビルダであるRealQueryクラスを利用する。SQLに慣れている開発者であればおなじみのSQL文に近いインタフェースが用意されており、メソッドチェーンで直感的にクエリを記述できる。また、ロジックによってクエリを追加するような複雑な場合でも、文字列でSQL文を作成するのに比べて、よりオブジェクトティブにクエリが構築できるのも魅力である。

ent127_img04.jpg

RealmQueryクラスにはこの他にもSQLではおなじみのmax, sum, distinctなどのインタフェースが実装されている。どのようなインタフェースがあるかはRealmQueryのソースコードを見るとわかりやすいだろう。

■Realm Java の今後

現状のRealm Javaの制限事項として、スレッド間のオブジェクトの受け渡しが出来無いという制限が挙げられる。これはプライマリキーなどを利用して再読込するか、RealmObjectではない他のオブジェクトにラッピングして受け渡すのが現状の解決策のようだ。これに関してはiOSでも同様の問題がある。今後の改善に期待しよう。
本連載第1回の頃ではRealm Cocoa / Realm Swiftの開発が活発であり、Realm Javaの機能実装はやや後追いのようなイメージがあったが、最近は開発者も増え、今やiOSに比べても同等かそれ以上に充実したプロダクトになっている。今後はより両言語間の差異や制限事項も少なくなり、さらに便利なデータベースエンジンとして成長していくであろう。

■Realm meetup

最後にRealmの最新動向をお伝えして本連載を締めくくりたい。先日10月27日に開催されたRealm meetup の内容をお伝えしよう。本連載第1回目以降に始まったこのmeetup も今回で8回目となる。回を重ねるごとにより実践的な内容が共有されるようになり、今回も貴重な技術交換の場となった。

ent127_img05.jpg

まずは10月よりRealm社にJOINした山崎誠氏によるJava版のアップデート情報が紹介された。Realm Java ではiOSに先立ち、非同期クエリの機能が組み込まれ、サンプルコードと共に解説が行われた。また、iOS/Java共にNULLプロパティがサポートされたことも大きく紹介された。
開発中の機能としてはRxJavaやマイグレーションAPIの刷新、また、iOSではtvOSへの対応が進められていると言う。いずれも楽しみな内容である。
後半はエキサイト社エンジニアの渡辺龍司氏による「アプリ開発初心者によるRealm導入事例」と題した体験談が聞けた。Realmの魅力として「特につまずくところが無かった」と、敷居の低さを強調し、これから新しく立ち上げるプロジェクトでは積極的に使うべきだと述べた。
最後は、株式会社日本経済新聞社より武市大志氏が登壇した。同氏はiOS/Androidアプリ「日経電子版」のプロジェクトマネージャーを務める。「日経電子版アプリが高速化のためにやったこと」と題した発表は、同社のプロジェクトの立ち上げから軌道に乗るまでの実践的な内容が紹介され、CoreDataからRealmへ移行した際の苦労話は会場を大きく沸かせた。最終的に同アプリではRealmを実装したことで起動時の読み込みが32秒から8秒にまで短縮できたと言う。

ent127_img06.jpg

Realm meetup は毎月最終週に開催されており、無料で参加が可能だ。このような貴重な体験談を生で聞けるチャンスを活用しない手は無いだろう。興味がある方は是非参加してほしい。meetupの開催告知はイベント支援サイトconnpassにて行われているのでチェックしておこう。

■Realm meetup

http://realm.connpass.com/

最後にmeetup主催のRealm社 岸川氏、また、毎回会場を提供して頂いているSansan株式会社様にこの場を借りてお礼を申し上げたい。

■まとめ

全3回にわたりRealmの連載をお送りしてきたが、まだまだ伝え切れていない魅力的な機能は多く残っている。とは言えRealm導入の技術的な敷居はかなり低いため、ある程度の実装までは直感的に進めることが出来るだろう。続きは是非ご自身の手でその魅力を確かめて欲しい。公式の日本語ドキュメントも充実しており、技術系サイトでもRealmのTipsが頻繁に取り上げられるようになってきたので、困ったときは逆引き的にこれらの情報を活用すると良いだろう。また、Realm社では誰でも参加可能なSlackチャンネルを用意している。
オンラインで質問して本家開発者から回答を得ることも可能だ。もちろん日本語での質問も可能なので是非活用してみよう。

・Realm Slack channel
http://slack.realm.io/

・Qiita Realmタグ
http://qiita.com/tags/realm

・スタック・オーバーフロー(日本語版) Realmタグ
http://ja.stackoverflow.com/questions/tagged/realm

原稿:繁田卓二
qnote最高技術責任者。猫とビールをこよなく愛するゆるキャラ系プログラマ。
Webアプリ開発からMacアプリ開発を経て現在はiOSアプリ開発に没頭。弱点はAndroid。

この記事はどうでしたか?

おすすめの記事

キャリアを考える

BACK TO TOP ∧

FOLLOW