ユーザ用ツール

サイト用ツール


サイドバー

プログレス合同会社

広告

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

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

: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モジュールへの依存関係を追記します。

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

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

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

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

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