Проблема переноса номера: внешний ключ как часть составного первичного ключа - PullRequest
0 голосов
/ 26 февраля 2020

Я перевожу БД в новую версию с добавлением 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'))")
            }

        }

1 Ответ

0 голосов
/ 26 февраля 2020

Мне очень жаль, я идиот. Я забыл удалить «trainNum», когда скопировал запрос в одну таблицу, и забыл добавить «ON DELETE CASCADE» в другую. Хотя я до сих пор не знаю, почему я не получил обычное исключение. Ну что ж. Модераторы, не стесняйтесь удалять этот вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...