データベース初期化クラスを作成します。
ファイル名を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
}
}
}
:appモジュールに:core:dataモジュールへの依存関係を追記します。
:
dependencies {
:
implementation(project(":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()
}
}
}
}
エミュレーターを起動して、アプリケーションを実行します。
ツールバー➡表示(V)➡ツールウィンドウ(T)➡App Inspectionでデータベースが作成されていることを確認します。