目次

18.データベースの初期化

データベース初期化クラスを作成します。
ファイル名をDatabaseInitializer.ktにしています。

:appモジュールや:featureモジュールから呼ばれるクラスは、repositoryディレクトリ内に作成することにします。

package jp.co.progress_llc.portal.core.data.repository

import javax.inject.Singleton
import javax.inject.Inject
import jp.co.progress_llc.portal.core.data.AppDatabase

/**
 * データベースを初期化するクラスです
 */
@Singleton
class DatabaseInitializer @Inject constructor(
  private val database: AppDatabase
) {
  private var isInitialized = false

  fun isInitialized(): Boolean {
    return isInitialized && database.isOpen
  }

  fun initialize(): Boolean {
    return if (isInitialized()) {
      true
    } else {
      // データベースを開きます(存在しない場合は作成されます)
      database.openHelper.writableDatabase.isOpen
      isInitialized = true
      true
    }
  }
}

10行目~11行目
DI(Hilt)の依存オブジェクトを宣言しています。
16行目~18行目
データベースの初期化状態をチェックします。
20行目~29行目
データベースを初期化します。
既に初期化済みの場合は何もしません。

appモジュールへ追記

:appモジュールに:core:dataモジュールへの依存関係を追記します。

   :
dependencies {
   :
  implementation(project(":core:data"))
   :
}

4行目
:core:dataモジュールへの依存関係を追記しています。

追記後、『Sync Now』で内容をプロジェクトに反映させます。

データベース初期化処理を呼び出し

:appモジュールのApplicationクラスにデータベース初期化処理の呼び出しを追記します。
データベースの初期化が終了する前に、ホーム画面が表示されないよう同期処理でデータベース初期化処理を呼び出します。

   :
import javax.inject.Inject
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import jp.co.progress_llc.portal.core.data.repository.DatabaseInitializer
   :
class PortalApplication: Application() {
  @Inject
  lateinit var databaseInitializer: DatabaseInitializer
  override fun onCreate() {
    super.onCreate()
    // データベースの初期化処理
    initializeDatabase()
  }

  private fun initializeDatabase() {
    // DatabaseInitializerを使用して初期化
    runBlocking {
      withContext(Dispatchers.IO) {
        databaseInitializer.initialize()
      }
    }
  }
}

2行目
Hiltのライブラリをimportしています。
3行目~5行目
同期処理用のライブラリをimportしています。
6行目
DatabaseInitializerimportしています。
9行目~10行目
databaseInitializerには、実行時(lateinit)にHiltでオブジェクトが初期化されるように定義しています。
19行目
同期処理で実行するように定義しています。
20行目
メインスレッドで重い処理を実行するとアプリ名」は応答していませんとなるので、別スレッド(I/Oスレッド)で実行させます。

エミュレーターを起動して、アプリケーションを実行します。
ツールバー表示(V)ツールウィンドウ(T)App Inspectionでデータベースが作成されていることを確認します。