android - 如何检查房间数据库的完整性?
问题描述
我有以下简单的数据库:
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 会照顾你以防止运行时崩溃。
推荐阅读
- javascript - 使用javascript函数获取html表格行和单元格索引
- python-3.x - 异常处理硒
- plot - 从版本 3 转换到版本 4 时出现绘图错误
- swiftui - 我的 Health Store 对象在 swift 应用程序中收到新数据(在 Health kit 中)时没有刷新数据
- html - 您如何将 socket.io 连接到您的实际网页?
- survival-analysis - 预测另一个时间段的生存模型系数(flexsurv R 包)
- asp.net - asp:RegularExpressionValidator 否定前瞻,不区分大小写
- firebase - firebase 控制台和 firestore 无法正常工作
- python - 无法在python中正确传递请求
- python - Python tkinter 按钮“不合适”/无法正常工作