Как проверить целостность базы данных комнаты? - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть следующая простая база данных:

NameList.kt

@Entity(tableName = "name_list")
data class NameList(
        @PrimaryKey(autoGenerate = true)
        var id: Long = 0L,

        @ColumnInfo(name = "name")
        var name: String = "")

NameListDao.kt

@Dao
interface NameListDao{    
    @Insert
    fun insert(nameList: NameList)

    @Update
    fun update(nameList: NameList)

    @Query("SELECT * FROM name_list ORDER BY id DESC")
    fun getAll(): LiveData<List<NameList>>
}

NameListRepository.kt

class NameListRepository(private val nameListDao: NameListDao){
    val allNames: LiveData<List<NameList>> = nameListDao.getAll()
}

Теперь, когда я изменяю таблицу в NameList.kt, добавляя / удаляя столбец, такой как

@Entity(tableName = "name_list")
data class NameList(
        @PrimaryKey(autoGenerate = true)
        var id: Long = 0L,

        @ColumnInfo(name = "first_name")
        var firstName: String = "",

        @ColumnInfo(name = "last_name")
        var lastName: String = "")

без удаления / изменения базы данных на телефоне, приложение вылетает со следующим сообщением об ошибке, когда Доступ к базе данных:

E AndroidRuntime: java.lang.RuntimeException: Exception while computing database live data.
E AndroidRuntime:   at androidx.room.RoomTrackingLiveData$1.run(RoomTrackingLiveData.java:92)
E AndroidRuntime:   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
E AndroidRuntime:   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
E AndroidRuntime:   at java.lang.Thread.run(Thread.java:764)
E AndroidRuntime: Caused by: java.lang.IllegalStateException: Room cannot verify the data integrity. Looks like you've changed schema but forgot to update the version number. You can simply fix this by increasing the version number.
E AndroidRuntime:   at androidx.room.RoomOpenHelper.checkIdentity(RoomOpenHelper.java:154)
E AndroidRuntime:   at androidx.room.RoomOpenHelper.onOpen(RoomOpenHelper.java:135)
E AndroidRuntime:   at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.onOpen(FrameworkSQLiteOpenHelper.java:142)
E AndroidRuntime:   at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:409)
E AndroidRuntime:   at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:298)
E AndroidRuntime:   at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworkSQLiteOpenHelper.java:92)
E AndroidRuntime:   at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.java:53)
E AndroidRuntime:   at androidx.room.RoomDatabase.inTransaction(RoomDatabase.java:476)
E AndroidRuntime:   at androidx.room.RoomDatabase.assertNotSuspendingTransaction(RoomDatabase.java:281)
E AndroidRuntime:   at androidx.room.RoomDatabase.query(RoomDatabase.java:324)
E AndroidRuntime:   at androidx.room.util.DBUtil.query(DBUtil.java:83)

Я знаю, что это связано с изменением таблицы (когда я удаляю базу данных вручную и создаю новую с новым объектом, ошибка исчезает).

Как я могу проверить целостность базы данных / таблицы (т. Е. Совпадает ли база данных NameList с той, к которой обращаются) перед тем, как получить к ней доступ? Предоставляет ли Room конкретный метод, который я пропустил, для этой цели?

Редактировать: Я думаю, что теперь я понял, в чем была ошибка версии. Но все же, возможно ли проверить целостность так, чтобы в случае несовпадения старой и новой базы данных я мог делать разные вещи, такие как удаление старой базы данных или наличие двух разных баз данных, и т. Д. c.?

1 Ответ

0 голосов
/ 10 февраля 2020

Вам необходимо обновлять версию базы данных каждый раз, когда вы вносите некоторые изменения в структуру. Как говорится в сообщении об ошибке

Вы можете просто исправить это, увеличив номер версии.

Комната заботится о вас, чтобы предотвратить сбои во время выполнения.

...