Androidアプリとデータベースのやり取りを自動処理するライブラリ「Room」とは
Roomは、Androidアプリがデータベースとやりとりする際に、その処理を自動化してくれるライブラリです。これがどのように便利なのか、まずは概観していきます。
旧来のAndroidのデータベース処理とその問題点
Androidアプリ内でデータベースを扱いたい場合は、内部に存在するSQLiteデータベースを利用します。そのSQLiteとやりとりするためのAPIが、Androidの最初期から存在しており、その仕組みを図にすると、図1のようになります。
![図1:SQLiteを利用した旧来のデータベース処理の仕組み](http://cz-cdn.shoeisha.jp/static/images/article/17124/17124_001.png)
核となるのが、SQLiteへのSQL実行を行なってくれるSQLiteDatabaseオブジェクトと、そのSQLiteDatabaseオブジェクトの生成やデータベースそのものの管理を行なってくれるヘルパーオブジェクトです。アクティビティでは、これらヘルパーオブジェクトからSQLiteDatabaseオブジェクトを取得し、そのSQLiteDatabaseに対してSQL文を実行していきます。
SQL文については、SQL文そのものを文字列定義して実行することもできますし、SQLiteDatabaseのメソッドを利用してSQL文を記述せずにデータ処理を行う方法も用意されています。
この旧来のデータベース処理は、いわゆるJDBCドライバを利用したピュアなJavaのデータベース処理に似ており、JDBCでのデータベース処理に慣れたプログラマからすると、わかりやすいコーディング方法です。一方で、やはり定型コードが多々あり、コーディング量が増えます。また、ヘルパーオブジェクトやSQLiteDatabaseオブジェクトの取得や解放を意識しなければなりませんし、Googleは単に取得や解放を行うのではなく、非同期での処理を推奨しています。SQLのデータ処理についても、同じく非同期処理を推奨しており、このような内容をいちからコーディングしようとすると、なかなか大変です。
Roomを使用する時に必要な3個の部品
そこで登場するのが、Roomです。Roomを利用すると、必要最小限のコードでデータベース処理を行えるようになるだけでなく、非同期処理も含めてデータベースとのやりとりを自動化してくれます。このRoomの仕組みを図にすると、図2のようになります。
![図2:Roomの仕組み](http://cz-cdn.shoeisha.jp/static/images/article/17124/17124_002.png)
図2中にもあるように、Roomで用意するものは、以下の3個です。
- エンティティ:SQLiteDatabaseを利用したデータベースアクセスの場合は、ヘルパークラスに記述したCREATE TABLE文でテーブル作成を行なっていました。一方、Roomを利用する場合は、テーブル構造に対応したJava/Kotlinクラスを作成し、テーブル作成を自動化します。このテーブル構造に対応したJava/Kotlinクラスのことをエンティティといいます。
- DAO:データの取得や更新といったデータ処理は、DAOオブジェクトにまとめます。ただし、このDAOはクラスではなく、インターフェースとして定義します。
- Room Database:エンティティをもとにテーブルを作成したり、DAOインターフェースをもとにDAOインスタンスを生成したり、何より、データベースそのものを管理するのが、このRoom Databaseオブジェクトです。
Room利用の準備
次節から、これら3個の部品のコーディング方法を紹介していきますが、その前にこれらRoomを利用するためのライブラリを設定しておく必要があります。この設定は、build.gradle(Module)への記述であり、JavaとKotlinとで記述する内容が違います。
Javaの場合は、リスト1の記述をdependenciesに追記します。
dependencies { def room_version = "2.4.3" // (1) implementation "androidx.room:room-runtime:$room_version" // (2) annotationProcessor "androidx.room:room-compiler:$room_version" // (2) implementation "androidx.room:room-guava:$room_version" // (3) implementation "com.google.guava:guava:31.1-android" // (4) : }
リスト1の(1)がRoomのバージョンを定義しているコードであり、原稿執筆時点では2.4.3が最新です。最新バージョンについては、Androidの公式ページから確認できます。(2)はRoom本体のライブラリであり、(3)と(4)が後述の非同期処理用のライブラリです。なお、(4)にもバージョン番号として31.1が定義されていますが、最新版はリリースノートのページから確認できます。
Kotlinの場合は、リスト2のコードを追記します。pluginsへの追記も必要な点に注意してください。
plugins { : id 'kotlin-kapt' // (3) } : dependencies { def room_version = "2.4.3" // (1) implementation "androidx.room:room-runtime:$room_version" // (2) annotationProcessor "androidx.room:room-compiler:$room_version" // (2) kapt "androidx.room:room-compiler:$room_version" // (3) implementation "androidx.room:room-ktx:$room_version" // (4) implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4" // (4) implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.5.1" // (4) : }
リスト2の(1)と(2)は、Java版と同じです。(3)は、これらRoomライブラリをKotlinで利用するためのコードです。(4)はKotlinの非同期処理であるコルーチンをRoomとともに利用するためのライブラリです。