版本更新后房间数据库回调不起作用
Room Database callback not working after version update
我正在构建一个使用 Room 库 db 的应用程序,我 运行 遇到了一个小问题。在我创建数据库的第一个版本中,我包含了一个回调来填充我的数据库,这样我就不会从一个空数据库开始:
@Provides
@Singleton
fun provideDatabase(app: Application , callback : MyDatabase.Callback) =
Room.databaseBuilder(app , MyDatabase::class.java, "home_database")
.fallbackToDestructiveMigration()
.addCallback(callback)
.build()
在第一个版本中,它运行良好,然后到了我不得不向数据库中添加另一个 table 的地步。这意味着模式发生了变化,现在我不得不将数据库版本号从 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" )
)
}
}
}
}
DestructiveMigration 上未调用 onCreate()。您需要将 onDestructiveMigration 添加到您的回调中,就像 onCreate:
override fun onDestructiveMigration(db: SupportSQLiteDatabase) {
super.onDestructiveMigration(db)
// Add your data
}
我正在构建一个使用 Room 库 db 的应用程序,我 运行 遇到了一个小问题。在我创建数据库的第一个版本中,我包含了一个回调来填充我的数据库,这样我就不会从一个空数据库开始:
@Provides
@Singleton
fun provideDatabase(app: Application , callback : MyDatabase.Callback) =
Room.databaseBuilder(app , MyDatabase::class.java, "home_database")
.fallbackToDestructiveMigration()
.addCallback(callback)
.build()
在第一个版本中,它运行良好,然后到了我不得不向数据库中添加另一个 table 的地步。这意味着模式发生了变化,现在我不得不将数据库版本号从 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" )
)
}
}
}
}
DestructiveMigration 上未调用 onCreate()。您需要将 onDestructiveMigration 添加到您的回调中,就像 onCreate:
override fun onDestructiveMigration(db: SupportSQLiteDatabase) {
super.onDestructiveMigration(db)
// Add your data
}