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

タスク:SleepNight 実体を作成する

Androidにおいて、データはデータクラスによって表されます。そしてそのデータは関数の呼び出しによって、アクセスされたり修正されたりします。しかしながら、データベースの世界では、実体とクエリというものが必要になります。

  • 実体とはデータベースに保存するためにオブジェクトや概念、およびそれらのプロパティを表すものです。実体クラスはテーブルとそのクラスがテーブル内で示す行ごとのインスタンスを定義します。それぞれのプロパティはカラムを定義します。今回のアプリでは、実体は睡眠した夜についての情報を保持します。
  • クエリとはデータベースのテーブル、およびテーブルの組み合わせからデータや情報を要求する際の要求、またデータ上でなんらかのアクションを起こさせるための要求のことを言います。一般的なクエリは実体の取得、挿入、更新などです。例えば、全ての夜の記録を開始時間で並べ替えて要求することなどができます。

RoomはKotlinデータクラスやSQLiteテーブルに保存されているデータの取得だったり、関数の宣言からSQLクエリに至るまでの面倒な作業をあなたに代わってこなしてくれます。

そのためにはそれぞれの実体をアノテーションされたデータクラスとして、またデータとのやり取りはアノテーションされたインターフェースである、データアクセスオブジェクト(DAO)として定義する必要があります。Roomはこれらのアノテーションされたクラスをデータベースにテーブルやデータベース上で動作するクエリを作成するために使用します。

ステップ1:SleepNight実体を作成する

このタスクでは、睡眠した一夜をアノテーションされたデータクラスとして定義します。

一夜ごとに、記録開始時間、終了時間、睡眠の質を記録する必要があります。

またそれぞれの夜を識別するために、IDが必要です。

  1. databaseパッケージのSleepNight.ktファイルを開いてください。
  2. SleepNightデータクラスをID、開始時間(ミリ秒)、終了時間、数値での睡眠の質用のパラメータと共に作成してください。
  • 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引数は必須ではありませんが、推奨されています。他の引数は公式ドキュメンテーションで調べることができます。

    Entityおよび他のandroidxライブラリ由来のアノテーションをインポートすることが促された場合は、インポートしてください。
@Entity(tableName = "daily_sleep_quality_table")
data class SleepNight(...)
  1. nightIdを主キーとして識別するために、nightIdプロパティを@PrimaryKeyでアノテーションしてください。autoGenerateパラメータにはtrueをセットして、Roomがそれぞれの実体ごとにIDを生成するようにしてください。これはそれぞれの夜の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. ビルド、起動し、コードにエラーがないことを確認してください。