When you need to add some inital data to you room
database you can add a callback to the databaseBuilder
and override onCreate
. This method will be executed once after the database and all tables are created.
AppDatabase.kt
package at.matthiaslischka.someApp.data
import android.arch.persistence.db.SupportSQLiteDatabase
import android.arch.persistence.room.Database
import android.arch.persistence.room.Room
import android.arch.persistence.room.RoomDatabase
import android.content.Context
import at.matthiaslischka.someApp.utils.ioThread
@Database(entities = [YourEntity::class], version = 1, exportSchema = false)
abstract class AppDatabase : RoomDatabase() {
abstract fun yourDao(): YourDao
companion object {
private var INSTANCE: AppDatabase? = null
fun getInstance(context: Context): AppDatabase =
INSTANCE ?: synchronized(this) {
INSTANCE ?: buildDatabase(context).also { INSTANCE = it }
}
private fun buildDatabase(context: Context) =
Room.databaseBuilder(context.applicationContext, AppDatabase::class.java, "YourDatabase.db")
.addCallback(seedDatabaseCallback(context))
.build()
private fun seedDatabaseCallback(context: Context): Callback {
return object : Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
ioThread {
var yourDao = getInstance(context)!!.yourDao()
yourDao.insert(YourEntity(..))
yourDao.insert(YourEntity(..))
..
}
}
}
}
}
}
ioThread
is just a small helper that wraps Executors.newSingleThreadExecutor
.
Executors.kt
package at.matthiaslischka.someApp.utils
import java.util.concurrent.Executors
private val IO_EXECUTOR = Executors.newSingleThreadExecutor()
fun ioThread(f : () -> Unit) {
IO_EXECUTOR.execute(f)
}