[英]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?有什么问题?
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.