重新打开应用程序时 Room 无法验证数据完整性

Jal*_*kun 2 android kotlin

我正在从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)

Jas*_*bek 5

中明确提到的所有内容

java.lang.IllegalStateException:Room 无法验证数据完整性。您似乎已更改架构但忘记更新版本号。您可以通过增加版本号来简单地解决此问题。

您所需要做的就是增加版本并设置exportSchemafalse

@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 创建另一个数据库,然后将它们包含到一个数据库中。你不应该为每个表创建新的数据库