: import android.content.Context import dagger.hilt.android.qualifiers.ApplicationContext import com.google.gson.Gson import com.google.gson.reflect.TypeToken : class DatabaseInitializer @Inject constructor( private val database: AppDatabase private val database: AppDatabase, @param:ApplicationContext private val context: Context ) { private var isInitialized = false private val basePackage = "${context.packageName}.core.data" private val assetsDir = "tableInitialData" : fun initialize(): Boolean { return if (isInitialized()) { // データベースは既に開いています true } else { // データベースを開きます(存在しない場合は作成されます) database.openHelper.writableDatabase.isOpen // テーブルを初期化します initializeTables() isInitialized = true true } } /** * assets/tableInitialDataディレクトリ内のJSONファイルでテーブルを初期化 */ private suspend fun initializeTables() { // assetsディレクトリ内のJSON初期化ファイルを取得 val fileNames = context.assets.list(assetsDir) ?: emptyArray() for (fileName in fileNames) { if (!fileName.endsWith(".json")) continue val entityName = fileName.substringBeforeLast('.') loadAndInsert(context, database, entityName, "${assetsDir}/${fileName}") } } /** * JSON初期化ファイルの内容でテーブルにレコードを全件INSERT */ private suspend fun loadAndInsert(context: Context, database: RoomDatabase, entityName: String, assetPath: String) { val entityClass = Class.forName("${basePackage}.${entityName}") val daoClass = Class.forName("${basePackage}.${entityName}Dao") // JSON初期化ファイルから初期化データを取得します val json = context.assets.open(assetPath).bufferedReader().use { it.readText() } val listType = TypeToken.getParameterized(List::class.java, entityClass).type val entities = Gson().fromJson>(json, listType) // INSERTするテーブルのDAOを取得します val daoGetter = "${entityName}Dao" val daoInstance = database.javaClass.getMethod(daoGetter).invoke(database) // insertAllを呼び出します val insertMethod = daoInstance::class.java.getMethod("insertAll", List::class.java) insertMethod.invoke(daoInstance, entities) } }