Android RoomDatabase получает исключение SupportSQLiteDatabase - PullRequest
0 голосов
/ 17 октября 2019

Я использую Room и мне нужно выполнить миграцию базы данных. Я перенес данные, но у меня проблема в одном из столбцов. Когда миграция выполнена, данные для этого столбца могут все еще быть недоступны.

Когда пользователь вводит данные, необходимые для этого столбца, я должен получить все строки, которые соответствуют значению в этом столбце, обновить эти значенияпредоставленный пользователем, и отбросьте все остальные строки, которые не совпадают.

У меня может быть метод в моем UserDao, но проблема в том, что это кажется неправильным, потому что это единовременная вещьи я не знаю, как выставить метод, поэтому моя идея заключалась в том, чтобы получить экземпляр базы данных и попытаться внести изменения самостоятельно.

Когда я использую

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

, я сохраняю ссылку нано потом, когда я делаю myDatabase.openHelper.writableDatabase, я всегда получаю исключение

getDatabase called recursively

Есть идеи, как с этим справиться?

1 Ответ

0 голосов
/ 17 октября 2019

Ваша проблема в том, что вы пытаетесь использовать openHelper MyDatabase, чтобы попытаться получить базу данных при создании экземпляра MyDatabase, который находится в процессе получения базы данных, поэтому при получении базы данных вы затем пытаетесь получить базу данных.

Вместо этого вам нужно использовать 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...