目次

41.一覧画面用のテーブルを追加

一覧画面用のテーブルを追加します。

List01Dataテーブルを作成します。

エンティティの作成

エンティティ(テーブル)定義クラスを作成します。

List01Data.ktを作成します。

package jp.co.example.android01.core.data

import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "list01_data")
data class List01Data(
  @PrimaryKey
  val key: String = "",
  val col1: String = "",
  val col2: String = "",
  val col3: String = ""
)

6行目
データベース上のテーブル名をlist01_dataにしています。
8行目
keyを主キーにしています。
9行目~12行目
カラム名と属性を定義しています。

DAOの作成

データベースにアクセスするためのインターフェースオブジェクト(DAO)を作成します。

package jp.co.example.android01.core.data

import androidx.room.Dao
import androidx.room.Query
import androidx.room.Insert
import androidx.room.OnConflictStrategy

@Dao
interface List01DataDao {
  @Query("SELECT * FROM list01_data")
  suspend fun getAllListData(): List<List01Data>

  @Insert(onConflict = OnConflictStrategy.REPLACE)
  suspend fun insertListDataByList(listDataList: List<List01Data>): List<Long>
}

10行目~11行目
レコードを全件取得します。
13行目~14行目
一覧データを元にレコードを追加します。
同じ主キーのレコードが存在していれば置き換えます。

データベースに追加

データベースAppDatabaseクラスに作成したエンティティ(テーブル)を追加します。

   :
import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase
   :
@Database(
  entities = [SiteUrl::class],
  entities = [SiteUrl::class, List01Data::class],
  version = 1,
  version = 2,
  exportSchema = false
)

abstract class AppDatabase : RoomDatabase() {
  abstract fun siteUrlDao(): SiteUrlDao
  abstract fun list01DataDao(): List01DataDao

  companion object {
   :
    /**
     * バージョン1から2へのマイグレーション
     * List01Dataテーブルを追加
     */
    private val MIGRATION_1_2 = object : Migration(1, 2) {
      override fun migrate(database: SupportSQLiteDatabase) {
        // List01Dataテーブルを作成
        database.execSQL("""
          CREATE TABLE IF NOT EXISTS `list01_data` (
            `key` TEXT NOT NULL,
            `col1` TEXT NOT NULL,
            `col2` TEXT NOT NULL,
            `col3` TEXT NOT NULL,
            PRIMARY KEY(`key`)
          )
        """.trimIndent())
      }
    }

    fun getDatabase(context: Context): AppDatabase {
   :
          .addMigrations(MIGRATION_1_2)
          .build()
   :

2行目~3行目
必要なimportを追加します。
6行目~7行目
List01Dataのエンティティクラスを追加します。
8行目~9行目
データベースのバージョンを上げます。
12行目
List01DataDAOを追加します。
21行目~38行目
データベースの移行定義をしています。
25行目
バージョン1から2への移行定義を表しています。
28行目~36行目
List01Dataのテーブル定義を追加するSQLを指定しています。
40行目
データベースを移行させます。
.fallbackToDestructiveMigration()にするとデータベースが再作成されます。
その場合、21行目~38行目のデータベースの移行定義は不要です。
データベースのバージョンアップは必要です。
データはすべて消えます。

DI(Hilt)モジュールへの追加

List01DataDaoDI(Hilt)モジュールに追加して、Hiltに生成(注入)方法を伝えます。

   :
import jp.co.example.android01.core.data.List01DataDao
   :
object HiltModule {
   :
  @Provides
  fun provideList01DataDao(database: AppDatabase): List01DataDao {
    return database.list01DataDao()
  }
   :

2行目
DAOをimportします。
6行目~9行目
依存オブジェクトとして、list01DataDaoを定義しています。