kotlin 版本更新后,房间数据库回调不工作

lskq00tm  于 2023-03-24  发布在  Kotlin
关注(0)|答案(1)|浏览(164)

我正在构建一个使用Room库db的应用程序,遇到了一个小问题。在第一个版本中,当我创建数据库时,我包含了一个回调来填充我的数据库,这样我就不会从空数据库开始:

@Provides
@Singleton
fun provideDatabase(app: Application , callback : MyDatabase.Callback) =
    Room.databaseBuilder(app , MyDatabase::class.java, "home_database")
        .fallbackToDestructiveMigration()
        .addCallback(callback)
        .build()

在这个第一个版本中,它工作得很好,然后它到了一个点,我不得不添加另一个表到数据库中。这意味着模式发生了变化,现在我不得不将数据库版本号从1更改为2。在我更改版本号然后运行应用程序后,我的回调似乎不再工作了,数据库开始时是空的。我最初认为fallbackToDestructiveMigration()将防止数据库丢失数据,并且它将在回调工作的情况下重新创建自己。有什么线索可以让回调函数重新工作吗?
数据库代码:

@Database(entities = [User::class , Result::class] , version = 2)
abstract class MyDatabase : RoomDatabase() {
    abstract fun dbDao() : Dao
    class Callback @Inject constructor(
        private val database : Provider<MyDatabase>,
        @ApplicationScope private val applicationScope: CoroutineScope
    ) : RoomDatabase.Callback(){

        override fun onCreate(db: SupportSQLiteDatabase) {
            super.onCreate(db)

            val dao = database.get().dbDao()

            applicationScope.launch {
                dao.addUser(
                    User(1 , "Larry" , "Android Developer","Boston" )
                )
                dao.addUser(
                    User(2 , "Garry" , "Javascript Developer","Casablanca" )
                )
           
            }
        }

    }

}
8cdiaqws

8cdiaqws1#

在DestructiveMigration上不会调用onCreate()。您需要将onDestructiveMigration添加到您的回调函数中,就像onCreate一样:

override fun onDestructiveMigration(db: SupportSQLiteDatabase) {
    super.onDestructiveMigration(db)
    // Add your data
}

请参阅:https://developer.android.com/reference/androidx/room/RoomDatabase.Callback#onDestructiveMigration(androidx.sqlite.db.SupportSQLiteDatabase)

相关问题