我正在从Codelabs学习如何使用 Room ,现在我有两张桌子
当我从 Android Studio 运行时是正常的
但是当我关闭并重新打开应用程序时,我收到错误
java.lang.IllegalStateException:Room 无法验证数据完整性。您似乎已更改架构但忘记更新版本号。您可以通过增加版本号来简单地解决此问题。
重新打开应用程序时出错,而不是安装时出错
我尝试提高版本号,但仍然出现错误
这是我的代码
@Database(entities = [Type::class], version = 3)
abstract class TypeRoomDb : RoomDatabase(){
abstract fun typeDao() : TypeDao
companion object{
@Volatile
private var INSTANCE : TypeRoomDb? = null
fun getDataBase(
context: Context,
scope: CoroutineScope
): TypeRoomDb {
return INSTANCE ?: synchronized(this){
val instance = Room.databaseBuilder(
context.applicationContext,
TypeRoomDb::class.java,
Cons.DB_NAME
)
.fallbackToDestructiveMigration()
.addCallback(TypeDbCallBack(scope))
.build()
INSTANCE = instance
instance
}
}
private class TypeDbCallBack(
private val scope: CoroutineScope
) : RoomDatabase.Callback(){
override fun onOpen(db: SupportSQLiteDatabase) {
super.onOpen(db)
INSTANCE?.let { database ->
scope.launch(Dispatchers.IO) {
populateDb(
database.typeDao()
)
}
}
}
}
fun populateDb(typeDao: TypeDao){
typeDao.deleteAll()
/*out*/
typeDao.insert(
Type(
"000",
"Makan",
0
)
)
typeDao.insert(
Type(
"001",
"Transportasi",
0
)
)
typeDao.insert(
Type(
"002",
"Makanan Ringan",
0
)
)
typeDao.insert(
Type(
"003",
"Komunikasi",
0
)
)
/*in*/
typeDao.insert(Type(
"500",
"Gaji",
1))
typeDao.insert(
Type(
"5001",
"Hadiah",
1
)
)
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的第二张桌子
@Database(entities = [LogKeuangan::class], version = 2)
abstract class LogKeuanganRoomDb : RoomDatabase() {
abstract fun logKeuanganDao(): LogKeuanganDao
companion object {
@Volatile
private var INSTANCE: LogKeuanganRoomDb? = null
fun getDataBase(
context: Context,
scope: CoroutineScope
): LogKeuanganRoomDb {
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
LogKeuanganRoomDb::class.java,
Cons.DB_NAME
)
.fallbackToDestructiveMigration()
.build()
INSTANCE = instance
instance
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
中明确提到的所有内容
java.lang.IllegalStateException:Room 无法验证数据完整性。您似乎已更改架构但忘记更新版本号。您可以通过增加版本号来简单地解决此问题。
您所需要做的就是增加版本并设置exportSchema为false
从
@Database(entities = [Type::class], version = 3)
Run Code Online (Sandbox Code Playgroud)
到
@Database(entities = [Type::class], version = 4, exportSchema = false)
Run Code Online (Sandbox Code Playgroud)
笔记
如果您希望所有表属于同一个数据库,则 @Database 创建另一个数据库,然后将它们包含到一个数据库中。你不应该为每个表创建新的数据库