この 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: スターター アプリをダウンロードして実行する
- GitHub から TrackMySleepQuality-Starter アプリをダウンロードします。
- アプリをビルドして実行します。アプリに
SleepTrackerFragmentフラグメントの UI が表示されますが、データは表示されません。ボタンをタップしても反応しない。
ステップ 2: スターター アプリを調べる
- Gradle ファイルを見てみましょう。
- プロジェクトの Gradle ファイル
プロジェクト レベルのbuild.gradleファイルで、ライブラリのバージョンを指定する変数を確認します。スターター アプリで使用されているバージョンは、相互にうまく連携し、このアプリともうまく連携します。この Codelab を完了するまでに、Android Studio から一部のバージョンの更新を求めるメッセージが表示されることがあります。更新するか、アプリ内のバージョンを維持するかは、ユーザーの判断に委ねられています。「奇妙な」コンパイル エラーが発生した場合は、最終的なソリューション アプリで使用されているライブラリ バージョンの組み合わせを試してください。 - モジュールの Gradle ファイル。
Roomを含むすべての Android Jetpack ライブラリの依存関係と、コルーチンの依存関係が提供されていることに注目してください。
- パッケージと UI を見てみましょう。アプリは機能ごとに構成されています。このパッケージには、この一連の Codelab でコードを追加するプレースホルダ ファイルが含まれています。
databaseパッケージ:Roomデータベースに関連するすべてのコード。sleepqualityパッケージとsleeptrackerパッケージには、各画面のフラグメント、ビューモデル、ビューモデル ファクトリが含まれています。
Util.ktファイルを見てみましょう。このファイルには、睡眠の質のデータを表示するのに役立つ関数が含まれています。一部のコードは、後で作成するビューモデルを参照しているため、コメントアウトされています。- androidTest フォルダ(
SleepDatabaseTest.kt)をご覧ください。このテストを使用して、データベースが意図したとおりに動作することを確認します。
Android では、データはデータクラスで表され、関数呼び出しを使用してアクセスおよび変更されます。しかしデータベースの世界では、「エンティティ」と「クエリ」が必要です。
- エンティティとは、データベースに保存するオブジェクトまたはコンセプト、およびそのプロパティのことです。エンティティ クラスによってテーブルが定義され、そのクラスの各インスタンスはテーブル内の各行を表します。また、各プロパティによって列が定義されます。今回のアプリでは、エンティティは睡眠に関する情報を保持します。
- クエリは、データベース テーブルまたはテーブルの組み合わせに対するデータや情報の処理要求、またはデータに対するアクションの実行要求です。一般的なクエリは、エンティティの取得、挿入、更新です。たとえば、記録されているすべての睡眠を、開始時間で並べ替えてクエリできます。
Room は、Kotlin データクラスから SQLite テーブルに保存できるエンティティへの変換、関数宣言から SQL クエリへの変換など、面倒な作業をすべて行います。
各エンティティはアノテーション付きデータクラスとして、インタラクションはアノテーション付きインターフェース(データ アクセス オブジェクト(DAO))として定義する必要があります。Room は、これらのアノテーション付きクラスを使用して、データベース内のテーブルと、データベースに対して動作するクエリを作成します。

ステップ 1: SleepNight エンティティを作成する
このタスクでは、1 晩の睡眠をアノテーション付きのデータクラスとして定義します。
1 晩の睡眠について、開始時間、終了時間、睡眠の質の評価を記録する必要があります。
また、夜を一意に識別するための ID も必要です。
databaseパッケージで、SleepNight.ktファイルを見つけて開きます。- ID、開始時間(ミリ秒単位)、終了時間(ミリ秒単位)、睡眠の質の数値評価のパラメータを含む
SleepNightデータクラスを作成します。
sleepQualityを初期化する必要があるため、-1に設定して、品質データが収集されていないことを示します。- 終了時間も初期化する必要があります。終了時刻がまだ記録されていないことを示すために、開始時刻に設定します。
data class SleepNight(
var nightId: Long = 0L,
val startTimeMilli: Long = System.currentTimeMillis(),
var endTimeMilli: Long = startTimeMilli,
var sleepQuality: Int = -1
)- クラス宣言の前に、データクラスに
@Entityアノテーションを付けます。テーブルにdaily_sleep_quality_tableという名前を付けます。tableNameの引数は省略可能ですが、指定することをおすすめします。他の引数については、ドキュメントをご覧ください。
プロンプトが表示されたら、androidxライブラリからEntityと他のすべてのアノテーションをインポートします。
@Entity(tableName = "daily_sleep_quality_table")
data class SleepNight(...)nightIdを主キーとして識別するには、nightIdプロパティに@PrimaryKeyアノテーションを付けます。Roomが各エンティティの ID を生成するように、パラメータautoGenerateをtrueに設定します。これにより、各泊の ID が一意になります。
@PrimaryKey(autoGenerate = true)
var nightId: Long = 0L,...- 残りのプロパティに
@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
)- コードをビルドして実行し、エラーがないことを確認します。
このタスクでは、データアクセス オブジェクト(DAO)を定義します。Android では、DAO により、データベースの挿入、削除、更新を簡単に行うことができます。
Room データベースを使用する場合、コードで Kotlin 関数を定義して呼び出すことでデータベースをクエリします。これらの Kotlin 関数は SQL クエリにマッピングされます。これらのマッピングは、アノテーションを使用して DAO で定義します。Room は必要なコードを作成します。
DAO は、データベースにアクセスするためのカスタム インターフェースを定義するものと考えてください。
一般的なデータベース操作の場合、Room ライブラリには @Insert、@Delete、@Update などの便利なアノテーションが用意されています。それ以外の場合は、@Query アノテーションがあります。SQLite でサポートされている、あらゆるクエリを記述できます。
さらに、Android Studio でクエリを作成すると、コンパイラが SQL クエリの構文エラーをチェックします。
睡眠夜の睡眠トラッカー データベースでは、次のことを行える必要があります。
- 新しい夜を挿入します。
- 既存の夜を更新して、終了時間と睡眠の質を更新します。
- キーに基づいて特定の夜を取得します。
- すべての夜を取得して、表示できるようにする。
- 最新の夜を取得します。
- データベース内のすべてのエントリを削除します。
ステップ 1: SleepDatabase DAO を作成する
databaseパッケージで、SleepDatabaseDao.ktを開きます。interfaceSleepDatabaseDaoに@Daoアノテーションが付いていることに注意してください。すべての DAO に@Daoキーワードのアノテーションを付ける必要があります。
@Dao
interface SleepDatabaseDao {}- インターフェースの本文内に
@Insertアノテーションを追加します。@Insertの下に、EntityクラスのSleepNightのインスタンスを引数として取るinsert()関数を追加します。
これで完了です。SleepNightをデータベースに挿入するために必要なすべてのコードがRoomによって生成されます。Kotlin コードからinsert()を呼び出すと、Roomが SQL クエリを実行し、エンティティをデータベースに挿入します(注: 関数には任意の名前を付けることができます)。
@Insert
fun insert(night: SleepNight)- 1 つの
SleepNight用にupdate()関数と@Updateアノテーションを追加します。更新されるエンティティは、渡されるエンティティと同じキーを持つエンティティです。エンティティの他のプロパティの一部または全部を更新できます。
@Update
fun update(night: SleepNight)残りの機能には便利なアノテーションがないため、@Query アノテーションを使用して SQLite クエリを指定する必要があります。
Longkey引数を受け取って null 許容のSleepNightを返すget()関数を含む@Queryアノテーションを追加します。パラメータが不足しているというエラーが表示されます。
@Query
fun get(key: Long): SleepNight?- クエリは、アノテーションの文字列パラメータとして指定します。
@Queryにパラメータを追加します。SQLite クエリであるStringにします。
daily_sleep_quality_tableからすべての列を選択します。WHERE句でnightIdを :key引数と一致させます。:keyに注目してください。クエリ内でコロン表記を使用して、関数内の引数を参照しています。
("SELECT * from daily_sleep_quality_table WHERE nightId = :key")clear()関数と SQLite クエリを含む別の@Queryを追加して、daily_sleep_quality_tableからすべてをDELETEします。このクエリでは、テーブル自体は削除されません。@Deleteアノテーションは 1 つのアイテムを削除します。@Deleteを使用して、削除する夜のリストを指定することもできます。欠点は、テーブルの内容を取得または把握する必要があることです。@Deleteアノテーションは特定のエントリを削除するのに適していますが、テーブルからすべてのエントリをクリアするには効率的ではありません。
@Query("DELETE FROM daily_sleep_quality_table")
fun clear()@QueryとgetTonight()関数を追加します。getTonight()によって返されるSleepNightを null 許容にすることで、テーブルが空の場合を関数で処理できるようにします。(テーブルは最初空で、データがクリアされた後も空です)。
データベースから「今夜」を取得するには、nightIdで降順に並べ替えられた結果のリストの最初の要素を返す SQLite クエリを記述します。LIMIT 1を使用して、1 つの要素のみを返します。
@Query("SELECT * FROM daily_sleep_quality_table ORDER BY nightId DESC LIMIT 1")
fun getTonight(): SleepNight?@QueryとgetAllNights()関数を追加します。
- 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>>- 目に見える変化はありませんが、アプリを実行してエラーがないことを確認します。
このタスクでは、前のタスクで作成した Entity と DAO を使用する Room データベースを作成します。
@Database アノテーションを付けた抽象データベース ホルダー クラスを作成する必要があります。このクラスには、データベースが存在しない場合はデータベースのインスタンスを作成し、既存のデータベースへの参照を返すメソッドが 1 つあります。
Room データベースの取得は少し複雑なので、コードの作成を開始する前に、一般的なプロセスを説明します。
extends RoomDatabaseを拡張するpublic abstractクラスを作成します。このクラスは、データベース ホルダーとして機能します。Roomが実装を作成するため、クラスは抽象クラスです。- クラスに
@Databaseアノテーションを付けます。引数で、データベースのエンティティを宣言してバージョン番号を設定します。 companionオブジェクト内で、SleepDatabaseDaoを返す抽象メソッドまたはプロパティを定義します。Roomによって本文が生成されます。- アプリ全体で必要な
Roomデータベースのインスタンスは 1 つのみであるため、RoomDatabaseをシングルトンにします。 Roomのデータベース ビルダーを使用して、データベースが存在しない場合にのみデータベースを作成します。それ以外の場合は、既存のデータベースを返します。
ステップ 1: データベースを作成する
databaseパッケージで、SleepDatabase.ktを開きます。- ファイルに、
RoomDatabaseを拡張するSleepDatabaseというabstractクラスを作成します。
クラスに@Databaseアノテーションを付けます。
@Database()
abstract class SleepDatabase : RoomDatabase() {}- エンティティとバージョン パラメータが欠落しているというエラーが表示されます。
@Databaseアノテーションには、Roomがデータベースを構築できるように、複数の引数が必要です。
entitiesのリストを持つ唯一の項目としてSleepNightを指定します。versionを1に設定します。 スキーマを変更するたびに、バージョン番号を増やす必要があります。- スキーマのバージョン履歴のバックアップを保持しないように、
exportSchemaをfalseに設定します。
entities = [SleepNight::class], version = 1, exportSchema = false- データベースは DAO について知る必要があります。クラスの本文内で、
SleepDatabaseDaoを返す抽象値を宣言します。複数の DAO を持つことができます。
abstract val sleepDatabaseDao: SleepDatabaseDao- その下に、
companionオブジェクトを定義します。コンパニオン オブジェクトを使用すると、クライアントはクラスをインスタンス化せずに、データベースを作成または取得するためのメソッドにアクセスできます。このクラスの唯一の目的はデータベースを提供することであるため、インスタンス化する理由はありません。
companion object {}companionオブジェクト内で、データベース用に null 許容のプライベート変数INSTANCEを宣言し、nullに初期化します。INSTANCE変数は、データベースの作成時に、データベースに対する参照を保持します。これにより、コストのかかるデータベースへの接続を繰り返し開くことを回避できます。
INSTANCE に @Volatile アノテーションを付けます。volatile 変数の値はキャッシュに保存されません。書き込みと読み取りはすべてメインメモリとの間で行われます。これにより、INSTANCE の値が常に最新になり、すべての実行スレッドで同じになります。つまり、あるスレッドが INSTANCE に加えた変更が、すぐに他のすべてのスレッドに反映されます。たとえば、2 つのスレッドがそれぞれキャッシュ内の同じエンティティを更新して問題が発生するような状況は発生しません。
@Volatile
private var INSTANCE: SleepDatabase? = nullINSTANCEの下、companionオブジェクト内で、データベース ビルダーに必要なContextパラメータを持つgetInstance()メソッドを定義します。SleepDatabase型を返します。getInstance()はまだ何も返していないため、エラーが表示されます。
fun getInstance(context: Context): SleepDatabase {}getInstance()内にsynchronized{}ブロックを追加します。コンテキストにアクセスできるように、thisを渡します。
複数のスレッドがデータベース インスタンスを同時に要求し、結果的に 1 つではなく 2 つのデータベースが作成される可能性があります。このサンプルアプリではこの問題は発生しにくいですが、より複雑なアプリでは発生する可能性があります。データベースを取得するコードをsynchronizedで囲むと、このコードブロックには一度に 1 つの実行スレッドしか入ることができず、データベースは一度だけ初期化されます。
synchronized(this) {}- 同期ブロック内で、
INSTANCEの現在の値をローカル変数instanceにコピーします。これは、ローカル変数でのみ使用できるスマートキャストを利用するためです。
var instance = INSTANCEsynchronizedブロック内で、synchronizedブロックの末尾でreturn instance。戻り値の型の不一致エラーは無視してください。完了したら null を返すことはありません。
return instancereturnステートメントの上に、instanceが null かどうか(つまり、まだデータベースが存在しないかどうか)を確認するifステートメントを追加します。
if (instance == null) {}instanceがnullの場合は、データベース ビルダーを使用してデータベースを取得します。ifステートメントの本文で、Room.databaseBuilderを呼び出し、渡されたコンテキスト、データベース クラス、データベースの名前sleep_history_databaseを指定します。このエラーを解消するには、以降のステップで移行戦略とbuild()を追加する必要があります。
instance = Room.databaseBuilder(
context.applicationContext,
SleepDatabase::class.java,
"sleep_history_database")- 必要な移行戦略をビルダーに追加します。
.fallbackToDestructiveMigration().
を使用します。通常は、スキーマが変更されたときの移行戦略を移行オブジェクトに指定する必要があります。
「移行オブジェクト」とは、データが失われないように、古いスキーマの行をすべて取得して新しいスキーマの行に変換する方法を定義するオブジェクトです。移行は、この Codelab の対象外です。簡単なソリューションは、データベースを破棄して再構築することです。この場合データは失われます。
.fallbackToDestructiveMigration()- 最後に、
.build()を呼び出します。
.build()ifステートメント内の最後のステップとしてINSTANCE = instanceを割り当てます。
INSTANCE = instance- 最終的なコードは次のようになります。
@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
}
}
}
}- コードをビルドして実行します。
これで、Room データベースを扱うためのビルディング ブロックが揃いました。このコードはコンパイルされて実行されますが、実際に機能するかどうかを確認する方法はありません。そのため、ここで基本的なテストを追加することをおすすめします。
ステップ 2: SleepDatabase をテストする
このステップでは、提供されたテストを実行して、データベースが機能することを確認します。これにより、データベースを構築する前にデータベースが機能することを確認できます。提供されるテストは基本的なものです。本番環境アプリでは、すべての DAO のすべての関数とクエリを実行します。
スターター アプリには androidTest フォルダが含まれています。この androidTest フォルダには、Android インストゥルメンテーションを含む単体テストが含まれています。これは、テストに Android フレームワークが必要であるため、物理デバイスまたは仮想デバイスでテストを実行する必要があることを意味します。もちろん、Android フレームワークを含まない純粋な単体テストを作成して実行することもできます。
- Android Studio の androidTest フォルダで、SleepDatabaseTest ファイルを開きます。
- コードのコメントを解除するには、コメントアウトされたコードをすべて選択して、キーボード ショートカット
Cmd+/またはControl+/を押します。 - ファイルをご覧ください。
テストコードは再利用可能なコードであるため、テストコードの概要を以下に示します。
SleepDabaseTestはテストクラスです。@RunWithアノテーションは、テストランナー(テストを設定して実行するプログラム)を識別します。- 設定時に、
@Beforeアノテーションが付けられた関数が実行され、SleepDatabaseDaoを使用してインメモリSleepDatabaseが作成されます。「インメモリ」とは、このデータベースがファイル システムに保存されず、テストの実行後に削除されることを意味します。 - また、インメモリ データベースをビルドするときに、コードは別のテスト固有のメソッド
allowMainThreadQueriesを呼び出します。デフォルトでは、メインスレッドでクエリを実行しようとするとエラーが発生します。このメソッドを使用すると、メインスレッドでテストを実行できます。これはテスト中のみ行う必要があります。 @Testアノテーションが付いたテストメソッドで、SleepNightを作成、挿入、取得し、それらが同じであることをアサートします。問題が発生した場合は、例外をスローします。実際のテストでは、複数の@Testメソッドを使用します。- テストが完了すると、
@Afterアノテーションが付けられた関数が実行され、データベースが閉じられます。
- [Project] ペインでテストファイルを右クリックし、[Run 'SleepDatabaseTest'] を選択します。
- テストの実行後、[SleepDatabaseTest] ペインで、すべてのテストに合格したことを確認します。

すべてのテストに合格したため、次のことがわかりました。
- データベースが正しく作成されます。
SleepNightをデータベースに挿入できます。SleepNightを取り戻すことができます。SleepNightに品質の正しい値が設定されている。
Android Studio プロジェクト: TrackMySleepQualityRoomAndTesting
データベースをテストするときは、DAO で定義されているすべてのメソッドを実行する必要があります。テストを完了するには 、他の DAO メソッドを実行するテストを追加して実行します。
- テーブルを、
@Entityアノテーション付きのデータクラスとして定義する。@ColumnInfoアノテーション付きのプロパティを、テーブルの列として定義する。 - データ アクセス オブジェクト(DAO)を、
@Daoアノテーション付きのインターフェースとして定義する。DAO は、Kotlin 関数をデータベース クエリにマッピングします。 - アノテーションを使用して、
@Insert、@Delete、@Update関数を定義する。 - SQLite クエリ文字列の
@Queryアノテーションを、他のクエリのパラメータとして使用します。 - データベースを返す
getInstance()関数を持つ抽象クラスを作成します。 - インストルメンテーション テストを使用して、データベースと DAO が期待どおりに動作していることをテストします。提供されたテストをテンプレートとして使用できます。
Udacity コース:
Android デベロッパー ドキュメント:
RoomDatabaseDatabase(アノテーション)Roomで未加工のクエリを使用できますRoomdatabase.Builder- テスト トレーニング
SQLiteDatabaseクラスDaoRoom永続ライブラリ
その他のドキュメントと記事:
- シングルトン パターン
- Google デベロッパー エキスパートによる記事: volatile と synchronized の適切な使用について
- コンパニオン オブジェクト
- Room による移行について
- Room による移行のテスト
- データベースの歴史
- SQLite ウェブサイト
- SQLite が理解できる SQL の完全な説明
このセクションでは、インストラクター主導のコースの一環として、この 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が変更された場合にRoomがLiveDataを更新します。 - 各
Roomデータベースには、DAO が 1 つだけ必要です。 - クラスを
Roomデータベースとして識別するには、RoomDatabaseのサブクラスにして、@Databaseアノテーションを付けます。
問題 4
@Dao インターフェースで使用できるアノテーションは、次のうちのどれですか。該当するものをすべて選択してください。
@Get@Update@Insert@Query
問題 5
データベースが機能していることを確認するには、どうすればよいですか?該当するものをすべて選択してください。
- インストゥルメント化テストを作成します。
- データが表示されるまで、アプリの作成と実行を続けます。
- DAO インターフェースのメソッドに対する呼び出しを、
Entityクラスの同等のメソッドに対する呼び出しに置き換える。 Roomライブラリが提供するverifyDatabase()関数を実行する。
次のレッスンに進む:
このコースの他の Codelab へのリンクについては、Android Kotlin の基礎の Codelab のランディング ページをご覧ください。