SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

一歩進んだAndroidアプリ開発ができる「Android Jetpack」入門

【Android Jetpack入門 】データベース処理を自動化してくれるライブラリ「Room」を徹底解説!

一歩進んだAndroidアプリ開発ができる「Android Jetpack」入門 第2回

  • このエントリーをはてなブックマークに追加

 CodeZineの連載「Android Studio2で始めるアプリ開発入門」が終了してから約1年後、Android Jetpackがリリースされ、一歩進んだAndroidアプリ開発が可能になりました。しかし、連載をもとに内容をアップデートした『Androidアプリ開発の教科書』では、入門書という位置付けのため、Jetpackの内容までは踏み込んでいません。本連載は、「Android Studio2で始めるアプリ開発入門」連載、および『Androidアプリ開発の教科書』の続編にあたる内容として、Jetpackを取り上げていきます。前回は、UIのデータを管理するためのライブラリであるViewModelを紹介しました。今回は、データベース処理を自動化してくれるRoomを紹介します。

  • このエントリーをはてなブックマークに追加

Androidアプリとデータベースのやり取りを自動処理するライブラリ「Room」とは

 Roomは、Androidアプリがデータベースとやりとりする際に、その処理を自動化してくれるライブラリです。これがどのように便利なのか、まずは概観していきます。

旧来のAndroidのデータベース処理とその問題点

 Androidアプリ内でデータベースを扱いたい場合は、内部に存在するSQLiteデータベースを利用します。そのSQLiteとやりとりするためのAPIが、Androidの最初期から存在しており、その仕組みを図にすると、図1のようになります。

図1:SQLiteを利用した旧来のデータベース処理の仕組み
図1:SQLiteを利用した旧来のデータベース処理の仕組み

 核となるのが、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の仕組み
図2:Roomの仕組み

 図2中にもあるように、Roomで用意するものは、以下の3個です。

  1. エンティティ:SQLiteDatabaseを利用したデータベースアクセスの場合は、ヘルパークラスに記述したCREATE TABLE文でテーブル作成を行なっていました。一方、Roomを利用する場合は、テーブル構造に対応したJava/Kotlinクラスを作成し、テーブル作成を自動化します。このテーブル構造に対応したJava/Kotlinクラスのことをエンティティといいます。
  2. DAO:データの取得や更新といったデータ処理は、DAOオブジェクトにまとめます。ただし、このDAOはクラスではなく、インターフェースとして定義します。
  3. Room Database:エンティティをもとにテーブルを作成したり、DAOインターフェースをもとにDAOインスタンスを生成したり、何より、データベースそのものを管理するのが、このRoom Databaseオブジェクトです。

Room利用の準備

 次節から、これら3個の部品のコーディング方法を紹介していきますが、その前にこれらRoomを利用するためのライブラリを設定しておく必要があります。この設定は、build.gradle(Module)への記述であり、JavaとKotlinとで記述する内容が違います。

 Javaの場合は、リスト1の記述をdependenciesに追記します。

リスト1:build.gradle(Module)への追記(Java版)
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への追記も必要な点に注意してください。

リスト2:build.gradle(Module)への追記(Kotlin版)
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とともに利用するためのライブラリです。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
Roomの三種の神器の作り方

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
一歩進んだAndroidアプリ開発ができる「Android Jetpack」入門連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 齊藤 新三(サイトウ シンゾウ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook<個人紹介>WINGSプロジェクト所属のテクニカルライター。Web系製作会社のシステム部門、SI会社を経てフリーランスとして独立。屋号はSarva(サルヴァ)。HAL大阪の非常勤講師を兼務。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/17124 2023/01/12 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング