Android RoomDatabase获取SupportSQLiteDatabase异常

时间:2019-10-17 11:46:43

标签: android android-room

我正在使用Room,我需要执行数据库迁移。我已经迁移了数据,但是其中一列出现了问题。执行迁移后,该列的数据可能仍然不可用。

当用户输入该列所需的数据时,我必须获取与该列中的值匹配的所有行,并根据用户提供的值更新这些值,并删除所有其他不匹配的行。

我可以在我的UserDao中有一个方法,但是问题在于这似乎不正确,因为这是一回事,而且我没有公开该方法的内容,所以我的想法是获取数据库实例并尝试自己进行更改。

当我使用

var myDatabase = Room.databaseBuilder(....)
.addMigrations(... .build()

我保留了对它的引用,但是当我myDatabase.openHelper.writableDatabase这样做时,我总是会遇到异常

getDatabase called recursively

有人知道如何处理吗?

1 个答案:

答案 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()