ユーザ用ツール

サイト用ツール


サイドバー

プログレス合同会社

広告

android:studio:application:core-database-module:initialize

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

:core:databaseモジュールにrepositoryパッケージ(ディレクトリ)を追加し、データベース初期化クラスDatabaseInitializer.ktを作成します。

title:/core/database/src/main/kotlin/jp/co/progress_llc/portal/core/database/repository/DatabaseInitializer.kt
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
    }
  }
}
8行目
DI(Hilt)の注入対象クラスにしています。
13行目~15行目
データベースの初期化状態をチェックします。
17行目~26行目
データベースを初期化します。
既に初期化済みの場合は何もしません。

appモジュールへ追記

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

title:/app/build.gradle.kts
   :
dependencies {
   :
  implementation(project(":core:database"))
   :
}
4行目
:core:databaseモジュールへの依存関係を追記しています。

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

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

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

title:/app/src/main/kotlin/jp/co/progress_llc/portal/PortalApplication.kt
   :
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行目
DI(Hilt)用のライブラリをimportします。
3行目~5行目
同期処理用のライブラリをimportします。
6行目
DatabaseInitializerをimportします。
9行目~10行目
databaseInitializerは、実行時(lateinit)にDI(Hilt)でオブジェクトが注入されるようにしています。
20行目
同期処理で実行するように定義しています。
21行目
メインスレッドで重い処理を実行すると「アプリ名」は応答していませんとなるので、別スレッド(I/Oスレッド)で実行させます。

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

android/studio/application/core-database-module/initialize.txt · 最終更新: by 管理者