【问题标题】:multiple room migration causes an error in android多房间迁移导致android出错
【发布时间】: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


    【解决方案1】:

    嗯...你的代码很奇怪。您不需要提供“降级迁移”,因为您必须始终增加数据库版本。相反,在降级的情况下,最好使用fallback 方法刷新数据库

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

    【讨论】:

    • 我需要它们,因为有时我需要检查旧版本(特别是在调试时我需要来回走动。原因是该设备不是个人手机而是商店中的设备,每个设备有自己的配置数据。)。 fallbackToDestructiveMigrationOnDowngrade 将重新创建数据库,这不是我的意图。我需要保留数据。
    • 即使我只添加了 MIGRATION_6_7 & fallbackToDestructiveMigrationOnDowngrade(),它也不起作用。这是同样的问题。
    猜你喜欢
    • 2018-05-13
    • 2020-05-17
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多