Android Kotlin の基礎 06.1: Room データベースを作成する

この Codelab は、Android Kotlin の基礎コースの一部です。このコースを最大限に活用するには、Codelab を順番に進めることをおすすめします。コースのすべての Codelab は、Android Kotlin の基礎の Codelab のランディング ページに一覧表示されています。

はじめに

ほとんどのアプリには、ユーザーがアプリを閉じた後も保存しておく必要のあるデータがあります。たとえば、プレイリスト、ゲームアイテムの在庫、収支の記録、星座表、睡眠データなどが挙げられます。通常、永続データの保存にはデータベースを使用します。

Room は、Android Jetpack の一部であるデータベース ライブラリです。Room は、データベースのセットアップと設定に関する多数の処理を行い、通常の関数呼び出しを使用してアプリでデータベースを操作できるようにします。内部的には、Room は SQLite データベースの上に位置する抽象化レイヤです。Room の用語と、より複雑なクエリのクエリ構文は、SQLite モデルに準拠しています。

下図に、このコースで推奨されているアーキテクチャ全体における Room データベースの位置付けを示します。

前提となる知識

以下について把握しておく必要があります。

  • Android アプリの基本的なユーザー インターフェース(UI)を作成する
  • アクティビティ、フラグメント、ビューの使用。
  • フラグメント間の移動と、Safe Args(Gradle プラグイン)を使用してフラグメント間でデータを渡す。
  • ビューモデル、ビューモデル ファクトリ、LiveData とそのオブザーバー。これらのアーキテクチャ コンポーネントのトピックについては、このコースの以前の Codelab で説明しています。
  • SQL データベースと SQLite 言語に関する基礎知識がある。概要や復習については、SQLite 入門をご覧ください。

学習内容

  • Room データベースを作成して操作し、データを永続化する方法。
  • データベース内のテーブルを定義するデータクラスを作成する方法。
  • データ アクセス オブジェクト(DAO)を使用して Kotlin 関数を SQL クエリにマッピングする方法。
  • データベースが機能しているかどうかをテストする方法。

演習内容

  • 夜間の睡眠データ用のインターフェースを備えた Room データベースを作成します。
  • 提供されたテストを使用してデータベースをテストします。

この Codelab では、睡眠の質を追跡するアプリのデータベース部分を構築します。アプリはデータベースを使用して、睡眠データを経時的に保存します。

このアプリには、下の図に示すように、フラグメントで表される 2 つの画面があります。

左側に表示されている最初の画面には、トラッキングの開始と停止を行うボタンがあります。画面には、ユーザーのすべての睡眠データが表示されます。[消去] ボタンをクリックすると、アプリがユーザーのために収集したすべてのデータが完全に削除されます。

右側の 2 つ目の画面は、睡眠の質の評価を選択するためのものです。アプリでは、評価は数値で表されます。開発目的で、アプリには顔アイコンとその数値が両方表示されます。

ユーザーのフローは次のとおりです。

  • ユーザーがアプリを開くと、睡眠トラッキング画面が表示されます。
  • ユーザーが [開始] ボタンをタップします。開始時間が記録され、表示されます。[開始] ボタンが無効になり、[停止] ボタンが有効になります。
  • ユーザーが [停止] ボタンをタップします。終了時刻が記録され、睡眠の質の画面が開きます。
  • ユーザーが睡眠の質のアイコンを選択します。画面が閉じ、トラッキング画面に睡眠終了時刻と睡眠の質が表示されます。[停止] ボタンは無効になり、[開始] ボタンは有効になります。アプリは次の夜の準備ができています。
  • [クリア] ボタンは、データベースにデータがある場合は常に有効になります。ユーザーが [クリア] ボタンをタップすると、確認メッセージが表示されることなく、すべてのデータが消去されます。

このアプリは、次の図に示すように、簡略化されたアーキテクチャを使用します。このアプリでは、次のコンポーネントのみを使用します。

  • UI コントローラ
  • モデルと LiveData を表示する
  • Room データベース

ステップ 1: スターター アプリをダウンロードして実行する

  1. GitHub から TrackMySleepQuality-Starter アプリをダウンロードします。
  2. アプリをビルドして実行します。アプリに SleepTrackerFragment フラグメントの UI が表示されますが、データは表示されません。ボタンをタップしても反応しない。

ステップ 2: スターター アプリを調べる

  1. Gradle ファイルを見てみましょう。
  • プロジェクトの Gradle ファイル
    プロジェクト レベルの build.gradle ファイルで、ライブラリのバージョンを指定する変数を確認します。スターター アプリで使用されているバージョンは、相互にうまく連携し、このアプリともうまく連携します。この Codelab を完了するまでに、Android Studio から一部のバージョンの更新を求めるメッセージが表示されることがあります。更新するか、アプリ内のバージョンを維持するかは、ユーザーの判断に委ねられています。「奇妙な」コンパイル エラーが発生した場合は、最終的なソリューション アプリで使用されているライブラリ バージョンの組み合わせを試してください。
  • モジュールの Gradle ファイル。Room を含むすべての Android Jetpack ライブラリの依存関係と、コルーチンの依存関係が提供されていることに注目してください。
  1. パッケージと UI を見てみましょう。アプリは機能ごとに構成されています。このパッケージには、この一連の Codelab でコードを追加するプレースホルダ ファイルが含まれています。
  • database パッケージ: Room データベースに関連するすべてのコード。
  • sleepquality パッケージと sleeptracker パッケージには、各画面のフラグメント、ビューモデル、ビューモデル ファクトリが含まれています。
  1. Util.ktファイルを見てみましょう。このファイルには、睡眠の質のデータを表示するのに役立つ関数が含まれています。一部のコードは、後で作成するビューモデルを参照しているため、コメントアウトされています。
  2. androidTest フォルダ(SleepDatabaseTest.ktをご覧ください。このテストを使用して、データベースが意図したとおりに動作することを確認します。

Android では、データはデータクラスで表され、関数呼び出しを使用してアクセスおよび変更されます。しかしデータベースの世界では、「エンティティ」と「クエリ」が必要です。

  • エンティティとは、データベースに保存するオブジェクトまたはコンセプト、およびそのプロパティのことです。エンティティ クラスによってテーブルが定義され、そのクラスの各インスタンスはテーブル内の各行を表します。また、各プロパティによって列が定義されます。今回のアプリでは、エンティティは睡眠に関する情報を保持します。
  • クエリは、データベース テーブルまたはテーブルの組み合わせに対するデータや情報の処理要求、またはデータに対するアクションの実行要求です。一般的なクエリは、エンティティの取得、挿入、更新です。たとえば、記録されているすべての睡眠を、開始時間で並べ替えてクエリできます。

Room は、Kotlin データクラスから SQLite テーブルに保存できるエンティティへの変換、関数宣言から SQL クエリへの変換など、面倒な作業をすべて行います。

各エンティティはアノテーション付きデータクラスとして、インタラクションはアノテーション付きインターフェース(データ アクセス オブジェクト(DAO))として定義する必要があります。Room は、これらのアノテーション付きクラスを使用して、データベース内のテーブルと、データベースに対して動作するクエリを作成します。

ステップ 1: SleepNight エンティティを作成する

このタスクでは、1 晩の睡眠をアノテーション付きのデータクラスとして定義します。

1 晩の睡眠について、開始時間、終了時間、睡眠の質の評価を記録する必要があります。

また、夜を一意に識別するための ID も必要です。

  1. database パッケージで、SleepNight.kt ファイルを見つけて開きます。
  2. ID、開始時間(ミリ秒単位)、終了時間(ミリ秒単位)、睡眠の質の数値評価のパラメータを含む SleepNight データクラスを作成します。
  • sleepQuality を初期化する必要があるため、-1 に設定して、品質データが収集されていないことを示します。
  • 終了時間も初期化する必要があります。終了時刻がまだ記録されていないことを示すために、開始時刻に設定します。
data class SleepNight(
       var nightId: Long = 0L,
       val startTimeMilli: Long = System.currentTimeMillis(),
       var endTimeMilli: Long = startTimeMilli,
       var sleepQuality: Int = -1
)
  1. クラス宣言の前に、データクラスに @Entity アノテーションを付けます。テーブルに daily_sleep_quality_table という名前を付けます。tableName の引数は省略可能ですが、指定することをおすすめします。他の引数については、ドキュメントをご覧ください。

    プロンプトが表示されたら、androidx ライブラリから Entity と他のすべてのアノテーションをインポートします。
@Entity(tableName = "daily_sleep_quality_table")
data class SleepNight(...)
  1. nightId を主キーとして識別するには、nightId プロパティに @PrimaryKey アノテーションを付けます。Room が各エンティティの ID を生成するように、パラメータ autoGeneratetrue に設定します。これにより、各泊の ID が一意になります。
@PrimaryKey(autoGenerate = true)
var nightId: Long = 0L,...
  1. 残りのプロパティに @ColumnInfo アノテーションを付けます。次のように、パラメータを使用してプロパティ名をカスタマイズします。
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "daily_sleep_quality_table")
data class SleepNight(
       @PrimaryKey(autoGenerate = true)
       var nightId: Long = 0L,

       @ColumnInfo(name = "start_time_milli")
       val startTimeMilli: Long = System.currentTimeMillis(),

       @ColumnInfo(name = "end_time_milli")
       var endTimeMilli: Long = startTimeMilli,

       @ColumnInfo(name = "quality_rating")
       var sleepQuality: Int = -1
)
  1. コードをビルドして実行し、エラーがないことを確認します。

このタスクでは、データアクセス オブジェクト(DAO)を定義します。Android では、DAO により、データベースの挿入、削除、更新を簡単に行うことができます。

Room データベースを使用する場合、コードで Kotlin 関数を定義して呼び出すことでデータベースをクエリします。これらの Kotlin 関数は SQL クエリにマッピングされます。これらのマッピングは、アノテーションを使用して DAO で定義します。Room は必要なコードを作成します。

DAO は、データベースにアクセスするためのカスタム インターフェースを定義するものと考えてください。

一般的なデータベース操作の場合、Room ライブラリには @Insert@Delete@Update などの便利なアノテーションが用意されています。それ以外の場合は、@Query アノテーションがあります。SQLite でサポートされている、あらゆるクエリを記述できます。

さらに、Android Studio でクエリを作成すると、コンパイラが SQL クエリの構文エラーをチェックします。

睡眠夜の睡眠トラッカー データベースでは、次のことを行える必要があります。

  • 新しい夜を挿入します。
  • 既存の夜を更新して、終了時間と睡眠の質を更新します。
  • キーに基づいて特定の夜を取得します。
  • すべての夜を取得して、表示できるようにする。
  • 最新の夜を取得します。
  • データベース内のすべてのエントリを削除します。

ステップ 1: SleepDatabase DAO を作成する

  1. database パッケージで、SleepDatabaseDao.kt を開きます。
  2. interface SleepDatabaseDao@Dao アノテーションが付いていることに注意してください。すべての DAO に @Dao キーワードのアノテーションを付ける必要があります。
@Dao
interface SleepDatabaseDao {}
  1. インターフェースの本文内に @Insert アノテーションを追加します。@Insert の下に、Entity クラスの SleepNight のインスタンスを引数として取る insert() 関数を追加します。

    これで完了です。SleepNight をデータベースに挿入するために必要なすべてのコードが Room によって生成されます。Kotlin コードから insert() を呼び出すと、Room が SQL クエリを実行し、エンティティをデータベースに挿入します(注: 関数には任意の名前を付けることができます)。
@Insert
fun insert(night: SleepNight)
  1. 1 つの SleepNight 用に update() 関数と @Update アノテーションを追加します。更新されるエンティティは、渡されるエンティティと同じキーを持つエンティティです。エンティティの他のプロパティの一部または全部を更新できます。
@Update
fun update(night: SleepNight)

残りの機能には便利なアノテーションがないため、@Query アノテーションを使用して SQLite クエリを指定する必要があります。

  1. Long key 引数を受け取って null 許容の SleepNight を返す get() 関数を含む @Query アノテーションを追加します。パラメータが不足しているというエラーが表示されます。
@Query
fun get(key: Long): SleepNight?
  1. クエリは、アノテーションの文字列パラメータとして指定します。@Query にパラメータを追加します。SQLite クエリである String にします。
  • daily_sleep_quality_table からすべての列を選択します。
  • WHERE 句で nightId を :key 引数と一致させます。

    :key に注目してください。クエリ内でコロン表記を使用して、関数内の引数を参照しています。
("SELECT * from daily_sleep_quality_table WHERE nightId = :key")
  1. clear() 関数と SQLite クエリを含む別の @Query を追加して、daily_sleep_quality_table からすべてを DELETE します。このクエリでは、テーブル自体は削除されません。

    @Delete アノテーションは 1 つのアイテムを削除します。@Delete を使用して、削除する夜のリストを指定することもできます。欠点は、テーブルの内容を取得または把握する必要があることです。@Delete アノテーションは特定のエントリを削除するのに適していますが、テーブルからすべてのエントリをクリアするには効率的ではありません。
@Query("DELETE FROM daily_sleep_quality_table")
fun clear()
  1. @QuerygetTonight() 関数を追加します。getTonight() によって返される SleepNight を null 許容にすることで、テーブルが空の場合を関数で処理できるようにします。(テーブルは最初空で、データがクリアされた後も空です)。

    データベースから「今夜」を取得するには、nightId で降順に並べ替えられた結果のリストの最初の要素を返す SQLite クエリを記述します。LIMIT 1 を使用して、1 つの要素のみを返します。
@Query("SELECT * FROM daily_sleep_quality_table ORDER BY nightId DESC LIMIT 1")
fun getTonight(): SleepNight?
  1. @QuerygetAllNights() 関数を追加します。
  • SQLite クエリが daily_sleep_quality_table のすべての列を降順で返すようにします。
  • getAllNights()SleepNight エンティティのリストを LiveData として返すようにします。Room がこの LiveData を最新の状態に維持します。つまり、データを明示的に取得する必要があるのは一度だけです。
  • 場合によっては、androidx.lifecycle.LiveData から LiveData をインポートする必要があります。
@Query("SELECT * FROM daily_sleep_quality_table ORDER BY nightId DESC")
fun getAllNights(): LiveData<List<SleepNight>>
  1. 目に見える変化はありませんが、アプリを実行してエラーがないことを確認します。

このタスクでは、前のタスクで作成した Entity と DAO を使用する Room データベースを作成します。

@Database アノテーションを付けた抽象データベース ホルダー クラスを作成する必要があります。このクラスには、データベースが存在しない場合はデータベースのインスタンスを作成し、既存のデータベースへの参照を返すメソッドが 1 つあります。

Room データベースの取得は少し複雑なので、コードの作成を開始する前に、一般的なプロセスを説明します。

  • extends RoomDatabase を拡張する public abstract クラスを作成します。このクラスは、データベース ホルダーとして機能します。Room が実装を作成するため、クラスは抽象クラスです。
  • クラスに @Database アノテーションを付けます。引数で、データベースのエンティティを宣言してバージョン番号を設定します。
  • companion オブジェクト内で、SleepDatabaseDao を返す抽象メソッドまたはプロパティを定義します。Room によって本文が生成されます。
  • アプリ全体で必要な Room データベースのインスタンスは 1 つのみであるため、RoomDatabase をシングルトンにします。
  • Room のデータベース ビルダーを使用して、データベースが存在しない場合にのみデータベースを作成します。それ以外の場合は、既存のデータベースを返します。

ステップ 1: データベースを作成する

  1. database パッケージで、SleepDatabase.kt を開きます。
  2. ファイルに、RoomDatabase を拡張する SleepDatabase という abstract クラスを作成します。

    クラスに @Database アノテーションを付けます。
@Database()
abstract class SleepDatabase : RoomDatabase() {}
  1. エンティティとバージョン パラメータが欠落しているというエラーが表示されます。@Database アノテーションには、Room がデータベースを構築できるように、複数の引数が必要です。
  • entities のリストを持つ唯一の項目として SleepNight を指定します。
  • version1に設定します。 スキーマを変更するたびに、バージョン番号を増やす必要があります。
  • スキーマのバージョン履歴のバックアップを保持しないように、exportSchemafalse に設定します。
entities = [SleepNight::class], version = 1, exportSchema = false
  1. データベースは DAO について知る必要があります。クラスの本文内で、SleepDatabaseDao を返す抽象値を宣言します。複数の DAO を持つことができます。
abstract val sleepDatabaseDao: SleepDatabaseDao
  1. その下に、companion オブジェクトを定義します。コンパニオン オブジェクトを使用すると、クライアントはクラスをインスタンス化せずに、データベースを作成または取得するためのメソッドにアクセスできます。このクラスの唯一の目的はデータベースを提供することであるため、インスタンス化する理由はありません。
 companion object {}
  1. companion オブジェクト内で、データベース用に null 許容のプライベート変数 INSTANCE を宣言し、null に初期化します。INSTANCE 変数は、データベースの作成時に、データベースに対する参照を保持します。これにより、コストのかかるデータベースへの接続を繰り返し開くことを回避できます。

INSTANCE@Volatile アノテーションを付けます。volatile 変数の値はキャッシュに保存されません。書き込みと読み取りはすべてメインメモリとの間で行われます。これにより、INSTANCE の値が常に最新になり、すべての実行スレッドで同じになります。つまり、あるスレッドが INSTANCE に加えた変更が、すぐに他のすべてのスレッドに反映されます。たとえば、2 つのスレッドがそれぞれキャッシュ内の同じエンティティを更新して問題が発生するような状況は発生しません。

@Volatile
private var INSTANCE: SleepDatabase? = null
  1. INSTANCE の下、companion オブジェクト内で、データベース ビルダーに必要な Context パラメータを持つ getInstance() メソッドを定義します。SleepDatabase 型を返します。getInstance() はまだ何も返していないため、エラーが表示されます。
fun getInstance(context: Context): SleepDatabase {}
  1. getInstance() 内に synchronized{} ブロックを追加します。コンテキストにアクセスできるように、this を渡します。

    複数のスレッドがデータベース インスタンスを同時に要求し、結果的に 1 つではなく 2 つのデータベースが作成される可能性があります。このサンプルアプリではこの問題は発生しにくいですが、より複雑なアプリでは発生する可能性があります。データベースを取得するコードを synchronized で囲むと、このコードブロックには一度に 1 つの実行スレッドしか入ることができず、データベースは一度だけ初期化されます。
synchronized(this) {}
  1. 同期ブロック内で、INSTANCE の現在の値をローカル変数 instance にコピーします。これは、ローカル変数でのみ使用できるスマートキャストを利用するためです。
var instance = INSTANCE
  1. synchronized ブロック内で、synchronized ブロックの末尾で return instance。戻り値の型の不一致エラーは無視してください。完了したら null を返すことはありません。
return instance
  1. return ステートメントの上に、instance が null かどうか(つまり、まだデータベースが存在しないかどうか)を確認する if ステートメントを追加します。
if (instance == null) {}
  1. instancenull の場合は、データベース ビルダーを使用してデータベースを取得します。if ステートメントの本文で、Room.databaseBuilder を呼び出し、渡されたコンテキスト、データベース クラス、データベースの名前 sleep_history_database を指定します。このエラーを解消するには、以降のステップで移行戦略と build() を追加する必要があります。
instance = Room.databaseBuilder(
                           context.applicationContext,
                           SleepDatabase::class.java,
                           "sleep_history_database")
  1. 必要な移行戦略をビルダーに追加します。.fallbackToDestructiveMigration().
    を使用します。通常は、スキーマが変更されたときの移行戦略を移行オブジェクトに指定する必要があります。
    「移行オブジェクト」とは、データが失われないように、古いスキーマの行をすべて取得して新しいスキーマの行に変換する方法を定義するオブジェクトです。移行は、この Codelab の対象外です。簡単なソリューションは、データベースを破棄して再構築することです。この場合データは失われます。
.fallbackToDestructiveMigration()
  1. 最後に、.build() を呼び出します。
.build()
  1. if ステートメント内の最後のステップとして INSTANCE = instance を割り当てます。
INSTANCE = instance
  1. 最終的なコードは次のようになります。
@Database(entities = [SleepNight::class], version = 1, exportSchema = false)
abstract class SleepDatabase : RoomDatabase() {

   abstract val sleepDatabaseDao: SleepDatabaseDao

   companion object {

       @Volatile
       private var INSTANCE: SleepDatabase? = null

       fun getInstance(context: Context): SleepDatabase {
           synchronized(this) {
               var instance = INSTANCE

               if (instance == null) {
                   instance = Room.databaseBuilder(
                           context.applicationContext,
                           SleepDatabase::class.java,
                           "sleep_history_database"
                   )
                           .fallbackToDestructiveMigration()
                           .build()
                   INSTANCE = instance
               }
               return instance
           }
       }
   }
}
  1. コードをビルドして実行します。

これで、Room データベースを扱うためのビルディング ブロックが揃いました。このコードはコンパイルされて実行されますが、実際に機能するかどうかを確認する方法はありません。そのため、ここで基本的なテストを追加することをおすすめします。

ステップ 2: SleepDatabase をテストする

このステップでは、提供されたテストを実行して、データベースが機能することを確認します。これにより、データベースを構築する前にデータベースが機能することを確認できます。提供されるテストは基本的なものです。本番環境アプリでは、すべての DAO のすべての関数とクエリを実行します。

スターター アプリには androidTest フォルダが含まれています。この androidTest フォルダには、Android インストゥルメンテーションを含む単体テストが含まれています。これは、テストに Android フレームワークが必要であるため、物理デバイスまたは仮想デバイスでテストを実行する必要があることを意味します。もちろん、Android フレームワークを含まない純粋な単体テストを作成して実行することもできます。

  1. Android Studio の androidTest フォルダで、SleepDatabaseTest ファイルを開きます。
  2. コードのコメントを解除するには、コメントアウトされたコードをすべて選択して、キーボード ショートカット Cmd+/ または Control+/ を押します。
  3. ファイルをご覧ください。

テストコードは再利用可能なコードであるため、テストコードの概要を以下に示します。

  • SleepDabaseTest はテストクラスです
  • @RunWith アノテーションは、テストランナー(テストを設定して実行するプログラム)を識別します。
  • 設定時に、@Before アノテーションが付けられた関数が実行され、SleepDatabaseDao を使用してインメモリ SleepDatabase が作成されます。「インメモリ」とは、このデータベースがファイル システムに保存されず、テストの実行後に削除されることを意味します。
  • また、インメモリ データベースをビルドするときに、コードは別のテスト固有のメソッド allowMainThreadQueries を呼び出します。デフォルトでは、メインスレッドでクエリを実行しようとするとエラーが発生します。このメソッドを使用すると、メインスレッドでテストを実行できます。これはテスト中のみ行う必要があります。
  • @Test アノテーションが付いたテストメソッドで、SleepNight を作成、挿入、取得し、それらが同じであることをアサートします。問題が発生した場合は、例外をスローします。実際のテストでは、複数の @Test メソッドを使用します。
  • テストが完了すると、@After アノテーションが付けられた関数が実行され、データベースが閉じられます。
  1. [Project] ペインでテストファイルを右クリックし、[Run 'SleepDatabaseTest'] を選択します。
  2. テストの実行後、[SleepDatabaseTest] ペインで、すべてのテストに合格したことを確認します。

すべてのテストに合格したため、次のことがわかりました。

  • データベースが正しく作成されます。
  • SleepNight をデータベースに挿入できます。
  • SleepNight を取り戻すことができます。
  • SleepNight に品質の正しい値が設定されている。

Android Studio プロジェクト: TrackMySleepQualityRoomAndTesting

データベースをテストするときは、DAO で定義されているすべてのメソッドを実行する必要があります。テストを完了するには 、他の DAO メソッドを実行するテストを追加して実行します。

  • テーブルを、@Entity アノテーション付きのデータクラスとして定義する。@ColumnInfo アノテーション付きのプロパティを、テーブルの列として定義する。
  • データ アクセス オブジェクト(DAO)を、@Dao アノテーション付きのインターフェースとして定義する。DAO は、Kotlin 関数をデータベース クエリにマッピングします。
  • アノテーションを使用して、@Insert@Delete@Update 関数を定義する。
  • SQLite クエリ文字列の @Query アノテーションを、他のクエリのパラメータとして使用します。
  • データベースを返す getInstance() 関数を持つ抽象クラスを作成します。
  • インストルメンテーション テストを使用して、データベースと DAO が期待どおりに動作していることをテストします。提供されたテストをテンプレートとして使用できます。

Udacity コース:

Android デベロッパー ドキュメント:

その他のドキュメントと記事:

このセクションでは、インストラクター主導のコースの一環として、この Codelab に取り組んでいる生徒向けに考えられる宿題をいくつか示します。インストラクターは、以下のようなことを行えます。

  • 必要に応じて宿題を与える
  • 宿題の提出方法を生徒に伝える
  • 宿題を採点する

インストラクターは、これらの提案を必要なだけ使用し、必要に応じて他の宿題も自由に与えることができます。

この Codelab に独力で取り組む場合は、これらの宿題を自由に使用して知識をテストしてください。

以下の質問に回答してください

問題 1

Room データベースに格納するエンティティを表すクラスであることを示すには、どうすればよいですか?

  • クラスが DatabaseEntity を拡張するようにします。
  • クラスに @Entity アノテーションを付けます。
  • クラスに @Database アノテーションを付けます。
  • クラスが RoomEntity を拡張するようにし、さらにクラスに @Room アノテーションを付ける。

問題 2

DAO(データ アクセス オブジェクト)は、Room が Kotlin 関数をデータベース クエリにマッピングするために使用するインターフェースです。

インターフェースが Room データベース用の DAO であることを示すには、どうすればよいですか。

  • インターフェースが RoomDAO を拡張するようにします。
  • インターフェースが EntityDao を拡張するようにし、DaoConnection() メソッドを実装します。
  • インターフェースに @Dao アノテーションを付けます。
  • インターフェースに @RoomConnection アノテーションを付けます。

問題 3

Room データベースの説明として正しいものは次のうちどれですか。該当するものをすべて選択してください。

  • Room データベースのテーブルは、アノテーション付きのデータクラスとして定義できます。
  • クエリから LiveData を返すと、LiveData が変更された場合に RoomLiveData を更新します。
  • Room データベースには、DAO が 1 つだけ必要です。
  • クラスを Room データベースとして識別するには、RoomDatabase のサブクラスにして、@Database アノテーションを付けます。

問題 4

@Dao インターフェースで使用できるアノテーションは、次のうちのどれですか。該当するものをすべて選択してください。

  • @Get
  • @Update
  • @Insert
  • @Query

問題 5

データベースが機能していることを確認するには、どうすればよいですか?該当するものをすべて選択してください。

  • インストゥルメント化テストを作成します。
  • データが表示されるまで、アプリの作成と実行を続けます。
  • DAO インターフェースのメソッドに対する呼び出しを、Entity クラスの同等のメソッドに対する呼び出しに置き換える。
  • Room ライブラリが提供する verifyDatabase() 関数を実行する。

次のレッスンに進む: 6.2 コルーチンと Room

このコースの他の Codelab へのリンクについては、Android Kotlin の基礎の Codelab のランディング ページをご覧ください。