【发布时间】:2021-06-22 11:10:23
【问题描述】:
我需要将数据库版本 5 迁移到 6、6 到 7,反之亦然。
所以我做的是。
Room.databaseBuilder(context, MainDatabase::class.java, DB_NAME)
.addMigrations(
MIGRATION_7_6,
MIGRATION_6_5,
MIGRATION_5_6,
MIGRATION_6_7)
.build()
5 和 6 之间的迁移很好。现在我在 6 到 7 之间实现。
这里是迁移
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 {
}
这是错误。
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=[]}
我认为该表没有正确创建。
但是数据库类是这样的:
@Database(entities = [A::class, B::class, ResultConfig::class], version = 7, exportSchema = false)
abstract class MainDatabase : RoomDatabase() {
// TODO:
}
所以,当前版本是 7。旧版本是 6。
有什么问题?
更新
我发现了问题,它是由 MIGRATION_6_7 引起的。 这一行。
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))")
但是,当我尝试这条线时,它奏效了。
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))")
但我真的很想用注解—— Entity 类中的@Entity(tableName = "result_config") 以确保完整性。如何解决和实现?
【问题讨论】:
标签: android android-room database-migration