我正在使用Room,我需要执行数据库迁移。我已经迁移了数据,但是其中一列出现了问题。执行迁移后,该列的数据可能仍然不可用。
当用户输入该列所需的数据时,我必须获取与该列中的值匹配的所有行,并根据用户提供的值更新这些值,并删除所有其他不匹配的行。
我可以在我的UserDao
中有一个方法,但是问题在于这似乎不正确,因为这是一回事,而且我没有公开该方法的内容,所以我的想法是获取数据库实例并尝试自己进行更改。
当我使用
var myDatabase = Room.databaseBuilder(....)
.addMigrations(... .build()
我保留了对它的引用,但是当我myDatabase.openHelper.writableDatabase
这样做时,我总是会遇到异常
getDatabase called recursively
有人知道如何处理吗?
答案 0 :(得分:0)
您的问题是,在构建正在获取数据库的MyDatabase实例时,您尝试使用MyDatabase的openHelper尝试获取数据库,因此在获取数据库时,您将尝试获取数据库。
相反,您需要使用传递给迁移的SupportSQLiteDatabase。
举一个例子:-
@Database(
version = 1,
entities = [
MyTableEntity::class
]
)
abstract class AppDatabase : RoomDatabase() {
abstract fun MyTableEntityDao(): MyTableEntityDao
companion object {
val MIGRATION_V1_V2: Migration = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
//........ code using the already opened database
database.execSQL(????????); //<<<<<<<<<< USES the support database
}
}
}
}
然后将使用类似于:-
的方法来调用它 var myDatabase = Room.databaseBuilder(applicationContext,AppDatabase::class.java,"mydatabase")
.allowMainThreadQueries()
.addMigrations(AppDatabase.MIGRATION_V1_V2)
.build()