[Android] Roomを使ったDB接続サンプル(Java)

投稿者: | 2021年3月25日

Androidアプリ開発でデータベースを使う機会は少なくないので、DB接続のサンプルとしてRoomの使用例をまとめます。

今回作ったのはこのようなアプリです。起動するとボタンが表示され・・

ボタンをクリックするたびに、クリック時のタイムスタンプが追加されていく、というものです。

ボタンをクリックすることで、まずクリック時のタイムスタンプをテーブルに格納し、その後それまで格納された全てのレコードを取得してTextViewに格納しています。

基本的にGoogleの公式ドキュメントに従って、Database, Entity, Daoを作成していきますが、DatabaseはSingletonで生成するとか、DBアクセスはUIスレッドとは別スレッドで実行しないといけないとか、制約がいろいろあります。

build.gradleへ依存関係の追加

まずはbuild.gradleに、Roomを使用するための依存関係を追加します。

画面レイアウトの作成

続いて画面レイアウトです。ここはButtonと、データ表示用のTextViewが並んだシンプルなもの。

Entityの作成

Entityです。主キーやカラムを示すためのアノテーションを付けます。

 

Daoの作成

Daoを作成します。interfaceとして作成し、メソッドを定義しておきます。

Databaseの作成

続いてDatabaseの作成です。RoomDatabaseを継承したabstractクラスになります。

Database呼び出し用Singletonクラスの作成

公式ページに以下の記載があるので、それに従ってSingletonクラスを作成します。

注: シングル プロセスで実行するアプリの場合は、AppDatabase オブジェクトをインスタンス化する際にシングルトン設計パターンに従ってください。各 RoomDatabase インスタンスは非常に高コストであり、単一のプロセス内で複数のインスタンスにアクセスする必要はほとんどありません。

Activityの作成

最後にActivityを整えます。

Activityの大まかな構成は次のようなものです。

DBへの非同期アクセス

RoomDatabaseの呼び出し処理は、UIと同じスレッドで実行するとエラーが発生します。

Cannot access database on the main thread since it may potentially lock the UI for a long period of time.

databaseの呼び出しはUIを長時間ロックする恐れがあるので、非同期で実行することが推奨されているようです。

今回は非同期アクセスの手段として、AsyncTaskを継承したinnerクラスを利用します。

上の概要で書いたように、この中でデータベースへのアクセス(データの格納・取得)と、TextViewへのセットを行っています。

今回はJavaを使用していますが、KotlinであればRoomがサポートしているCoroutineを使えるらしい。。

全体サンプルコード

他の処理も追加した全体のActivityコードは次のようになります。

まとめ

Roomを使用する際は、次の点に注意しながら作成していけば良いことがわかりました。

  • Roomを使用する場合は、主にEntity, Dao, Databaseの3種類のクラスで構成する
  • RoomDatabaseはSingletonで生成する
  • RoomDatabaseへのアクセス処理は、メインのスレッドとは別スレッドで行う