【问题标题】:Android Room DB MigrationAndroid 房间数据库迁移
【发布时间】:2021-08-13 10:16:13
【问题描述】:

问题 - 强制更新 Play 商店更新时,Room DB 被擦除/清除。我正在开发一个使用 Room DB 作为本地数据库的聊天信使应用程序。每当我使用增加的数据库版本进行商店更新时,本地数据库都会被清除并且消息历史记录会丢失。

我正在使用 Room DB。我的应用程序在 Play Store 中使用 Room DB,版本为 4。

我的问题是我正在更改 9 个表架构,现在我更新了数据库版本,每个表架构都发生了变化。我应该在这里增加数据库版本吗?如何在不丢失用户数据的情况下使用 Room DB 在 Play 商店中强制更新来完成此操作?前任。 DB 版本为 4,我更改了两个表的元素,如下所示。

我是否需要在更改两个表时将数据库版本增加两次或更改为一个数字增量就可以了?示例:我需要 DB 将版本增加到 6 还是保持 5 就足够了?

private val mMigrationMessageStatus: Migration = object : Migration(4, 5) {
            override fun migrate(database: SupportSQLiteDatabase) {
                database.execSQL("ALTER TABLE message_status RENAME TO MessageStatus")
                database.execSQL("ALTER TABLE MessageStatus ADD COLUMN userId TEXT NOT NULL default ''")
            }
        }
 private val mMigrationGroupMember: Migration = object : Migration(4, 5) {
            override fun migrate(database: SupportSQLiteDatabase) {
                database.execSQL("ALTER TABLE group_member RENAME TO GroupMember")
                database.execSQL("ALTER TABLE GroupMember ADD COLUMN userId TEXT NOT NULL default ''")
            }
        }


return Room.databaseBuilder(context, AppDatabase::class.java, dbName)
                .allowMainThreadQueries()
                .addMigrations(mMigrationMessageStatus,mMigrationGroupMember)
                .build()

【问题讨论】:

  • 请阅读this 由于您正在重命名表,因此应处理歧义。也请阅读this
  • 如果我添加自动迁移,那么我将跳过查询,并且避免向构建器添加迁移,或者还必须在构建器中提供。
  • 无论您要在新版本的数据库中进行多少更改,只要增加一个数字就可以了。但请确保您处理行为或数据库更改。因为某些列或字段可能为 null 或为空。
  • 我执行所有查询并检查内部应用程序测试,但我一一更改表并测试它会正常工作。但是对每 9 个表所做的所有表更改和数据库版本都将是增量的,然后进行内部测试无法正常工作。这是阿萨德的一个问题。

标签: android kotlin android-room database-migration


【解决方案1】:

房间版本 2.4.0,您可以使用 autoMigrations 轻松更新。

数据库类

@Database(
    version = 3,
    autoMigrations = [
        AutoMigration(from = 1, to = 2),
        AutoMigration(from = 2, to = 3)
    ],
    .....
)

数据类

@Entity(tableName = "user")
data class DataUser(
    ....
    // I added this column, like this
    @ColumnInfo(defaultValue = "")var test: String = ""  
)

参见下面的参考

android developer: room version2.4.0

android developer: autoMigration

【讨论】:

  • 好的,该链接是我在另一个答案中添加的内容。我删除了链接并将相同的答案放回此处。
猜你喜欢
  • 1970-01-01
  • 2019-02-13
  • 2018-11-11
  • 1970-01-01
  • 2021-09-02
  • 2021-11-18
  • 2020-05-17
  • 1970-01-01
  • 2021-12-11
相关资源
最近更新 更多