简体   繁体   English

多房间迁移导致android报错

[英]multiple room migration causes an error in android

I need to migrate the Database version 5 to 6, 6 to 7 and vice versa.我需要将数据库版本 5 迁移到 6、6 到 7,反之亦然。

So what I did is.所以我做的是。

Room.databaseBuilder(context, MainDatabase::class.java, DB_NAME)
    .addMigrations(
        MIGRATION_7_6,
        MIGRATION_6_5,
        MIGRATION_5_6,
        MIGRATION_6_7)
    .build()

The migration between 5 and 6 was fine. 5 到 6 之间的迁移很好。 And now I am implementing between 6 and 7.现在我正在实施 6 到 7 之间。

Here's MIGRATIONs这是迁移

val MIGRATION_6_7 = object : Migration(6, 7) {
    override fun migrate(database: SupportSQLiteDatabase) {
        database.execSQL("CREATE TABLE ResultConfig(seq INTEGER NOT NULL, json_data TEXT NOT NULL, updated_at TEXT NOT NULL, created_at TEXT NOT NULL, PRIMARY KEY(seq))")
    }
}

val MIGRATION_7_6 = object : Migration(7, 6) {
    override fun migrate(database: SupportSQLiteDatabase) {
        database.execSQL("DROP TABLE ResultConfig")
    }
}
@Parcelize
@Keep
@Entity(tableName = "result_config")
data class ResultConfig(
        @PrimaryKey(autoGenerate = true) val seq: Long,
        @ColumnInfo(name = "json_data") var jsonData: String,
        @ColumnInfo(name = "updated_at") var updatedAt: String,
        @ColumnInfo(name = "created_at") var createdAt: String
) : Parcelable {
}

And here's the error.这是错误。

Expected:
    TableInfo{name='result_config', columns={created_at=Column{name='created_at', type='TEXT',
affinity='2', notNull=true, primaryKeyPosition=0,
defaultValue='null'}, updated_at=Column{name='updated_at',
type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0,
defaultValue='null'}, seq=Column{name='seq', type='INTEGER',
affinity='3', notNull=true, primaryKeyPosition=1,
defaultValue='null'}, json_data=Column{name='json_data', type='TEXT',
affinity='2', notNull=true, primaryKeyPosition=0,
defaultValue='null'}}, foreignKeys=[], indices=[]}
Found:
    TableInfo{name='result_config', columns={}, foreignKeys=[], indices=[]}

I think the table hasn't created properly.我认为该表没有正确创建。

But the database class is like this:但是数据库 class 是这样的:

@Database(entities = [A::class, B::class, ResultConfig::class], version = 7, exportSchema = false)
abstract class MainDatabase : RoomDatabase() {
    // TODO:
}

So, the current version is 7. And older version is 6.所以,当前版本是 7。旧版本是 6。

What's the problem?有什么问题?

UPDATE更新

I found the problem and it causes because of MIGRATION_6_7.我发现了问题,它是由于 MIGRATION_6_7 引起的。 This line.这条线。

database.execSQL("CREATE TABLE ResultConfig(seq INTEGER NOT NULL, json_data TEXT NOT NULL, updated_at TEXT NOT NULL, created_at TEXT NOT NULL, PRIMARY KEY(seq))")

However, when I try this line, it worked.但是,当我尝试这条线时,它起作用了。

database.execSQL("CREATE TABLE `remote_config`(seq INTEGER NOT NULL, json_data TEXT NOT NULL, updated_at TEXT NOT NULL, created_at TEXT NOT NULL, PRIMARY KEY(seq))")

But I really want to use the annotation - @Entity(tableName = "result_config") in the Entity class for integrity.但我真的想在实体 class 中使用注释 - @Entity(tableName = "result_config") 以确保完整性。 How can I solve and achieve it?我该如何解决并实现它?

Hum... your code is weird.嗯...你的代码很奇怪。 You don't need to provide a 'downgrade migration' because you must always increase the DB version.您不需要提供“降级迁移”,因为您必须始终增加数据库版本。 Instead, in case of downgrade, it's better to flush the DB with the fallback method相反,在降级的情况下,最好使用fallback方法刷新数据库

Room.databaseBuilder(context, MainDatabase::class.java, DB_NAME)
    .addMigrations(
        MIGRATION_5_6,
        MIGRATION_6_7)
    .fallbackToDestructiveMigrationOnDowngrade()
    .build()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM