我正在构建一个使用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" )
)
}
}
}
}
1条答案
按热度按时间8cdiaqws1#
在DestructiveMigration上不会调用onCreate()。您需要将onDestructiveMigration添加到您的回调函数中,就像onCreate一样:
请参阅:https://developer.android.com/reference/androidx/room/RoomDatabase.Callback#onDestructiveMigration(androidx.sqlite.db.SupportSQLiteDatabase)