Я перевожу БД в новую версию с добавлением 2 новых таблиц и получаю это: 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.
Дело в том, что я увеличил версию и у меня есть миграция, и она даже не говорит мне, что я ' я поступаю неправильно, как обычно («ожидал чего-то-чего-то»). Я подозреваю, что проблема может быть в таблице, где я использую внешний ключ как часть составного первичного ключа, но согласно документации SQLite я все делаю правильно. Чего мне не хватает?
Существующая таблица, на которую я ссылаюсь:
@Entity
data class RailcarOnStationEntity(
@PrimaryKey
var railcarId: Int = 0,
...
)
Новая таблица 1:
@Entity
data class BoolDictionaryResponseEntity (
var createdAt: Long,
var updatedAt: Long,
@PrimaryKey
var id: Int,
var sysCode: String,
var name: String
) {
override fun toString(): String {
return Gson().toJson(this)
}
}
Новая таблица 2:
@Entity(foreignKeys = [
ForeignKey(
entity = RailcarOnStationEntity::class,
parentColumns = ["railcarId"],
childColumns = ["railcarId"],
onDelete = ForeignKey.CASCADE
)],
primaryKeys = ["railcarId","dictId"])
data class BoolDictionaryResponseEntityRel (
var railcarId: Int,
var dictId: Int,
var value: Boolean,
var dictName: String
) {
override fun toString(): String {
return Gson().toJson(this)
}
}
DB:
@Database(
entities = [... RailcarOnStationEntity::class, ... BoolDictionaryResponseEntity::class, BoolDictionaryResponseEntityRel::class], version = 6
)
...
@Volatile
private var INSTANCE: UserRoomDatabase? = null
operator fun invoke(context: Context): UserRoomDatabase {
return INSTANCE ?: synchronized(this) {
INSTANCE ?: Room.databaseBuilder(
context.applicationContext,
UserRoomDatabase::class.java,
"user_database"
)
.addMigrations(..., MIGRATION_5_6)
.build().also { INSTANCE = it }
}
}
...
private val MIGRATION_5_6 = object : Migration(5, 6) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("CREATE TABLE IF NOT EXISTS BoolDictionaryResponseEntity ('id' INTEGER NOT NULL, 'trainNum' TEXT NOT NULL, 'sysCode' TEXT NOT NULL, 'name' TEXT NOT NULL, 'createdAt' INTEGER NOT NULL, 'updatedAt' INTEGER NOT NULL, PRIMARY KEY('id'))")
database.execSQL("CREATE TABLE IF NOT EXISTS BoolDictionaryResponseEntityRel ('railcarId' INTEGER NOT NULL, 'dictId' INTEGER NOT NULL, 'value' INTEGER NOT NULL, 'dictName' TEXT NOT NULL, PRIMARY KEY('railcarId','dictId'), FOREIGN KEY ('railcarId') REFERENCES RailcarOnStationEntity('railcarId'))")
}
}