не мог понять, как заставить сопрограммы работать правильно для вставки данных в базу данных Room - PullRequest
0 голосов
/ 27 января 2020

Я не смог найти проблему не вставки данных в Room Database при первом запуске приложения, но при перезапуске приложения вставляются данные. Почему не происходит вставка при первом запуске?

Мой код:

@Dao
interface FooDAO {    
    @Insert
    suspend fun save(foo: Foo)            
}

и класс базы данных такой же простой:

@Database(entities = [Foo::class], version = 1, exportSchema = false)
abstract class FooDatabase: RoomDatabase() {

    // get dao
    abstract fun getFooDao(): FooDAO

    companion object{

        @Volatile private var INSTANCE: FooDatabase? = null

        fun getDatabase(context: Context): FooDatabase {
            if (INSTANCE == null) {
                synchronized(this) {
                    INSTANCE = Room.databaseBuilder(
                        context.applicationContext,
                        FooDatabase::class.java,
                        "my_db.db"
                    ).fallbackToDestructiveMigration()
                        .addCallback(CALLBACK)
                        .build()
                }
            }

            return INSTANCE!!

        }

        private val CALLBACK = object : RoomDatabase.Callback() {
            override fun onCreate(db: SupportSQLiteDatabase) {
                super.onCreate(db)
                val fooDAO = INSTANCE!!.getFooDao()
                CoroutineScope(Dispatchers.IO).launch {
                    fooDAO.save(Foo(1, "A"))
                    fooDAO.save(Foo(2, "B"))
                    fooDAO.save(Foo(3, "C"))
                    fooDAO.save(Foo(4, "D"))
                    fooDAO.save(Foo(5, "E"))                        
                }

            }
        }    

    }

}

с кодом выше записи не вставляется при первом запуске приложения, но при перезапуске вставляются записи, как мы можем исправить эту проблему и заставить его вставлять записи и при первом запуске?

...