[英]How to check Room database integrity?
我有以下簡單的數據庫:
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 會照顧您以防止運行時崩潰。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.