【问题标题】:How to check Room database integrity?如何检查房间数据库的完整性?
【发布时间】:2020-02-10 13:50:23
【问题描述】:

我有以下简单的数据库:

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 是否为此目的提供了我错过的特定方法?

编辑:我想我现在明白了版本错误的含义。 但是,是否可以检查完整性,以便在新旧数据库不匹配的情况下,我可以执行不同的操作,例如删除旧数据库或拥有两个不同的数据库等?

【问题讨论】:

  • 您是否阅读了完整的例外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. 并且您是否阅读了有关 Room 的任何文档?很容易理解!

标签: android kotlin android-room


【解决方案1】:

每次对结构进行一些更改时,都必须更新数据库版本。正如错误所说

您可以通过增加版本号来解决此问题。

Room 会照顾您以防止运行时崩溃。

【讨论】:

  • 数据库版本是指@Database(entities = [NameList::class], version = 1, exportSchema = false)中的版本吗?我将其更改为version = 2,现在它确实有效。直到现在我才知道实际指的是什么“版本”。是否可以自动增加版本号,这样我每次更改表时都不必手动执行?
  • @mousou 不。每次对数据库结构进行任何更改时,您都必须手动进行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-04
  • 2021-07-22
相关资源
最近更新 更多