【问题标题】:Could not migrate to Room无法迁移到房间
【发布时间】:2018-02-20 09:01:36
【问题描述】:

我决定在我当前的应用程序中使用 Room。 发现当前架构中的一列没有类型,并且 Room 在迁移时生成 IllegalStateException

java.lang.IllegalStateException: Migration didn't properly handle item.
 Expected:
TableInfo{name='item', columns={optional_modifiers=Column{a_type=Column{name='a_type', type='BLOB', notNull=false, primaryKeyPosition=0}...}
 Found:
TableInfo{name='item', columns={optional_modifiers=Column{a_type=Column{name='a_type', type='', notNull=false, primaryKeyPosition=0}...}

建表的Sql脚本:

"create table item ("
                " id text primary key," +
                " a_type, "
//...
                ")

实体类:

@Entity(tableName = "item")
data class Item(
    @PrimaryKey
    val id: String?,
    val a_type: String? // actually I used several types, but none of them is worked
)

有没有办法解决这个问题?

【问题讨论】:

  • 能否请您分享您的新实体类和旧架构?
  • 错误表示您的迁移中发生了数据类型不匹配。
  • @Pinakin 是的,我看到它是类型不匹配。但是房间里没有“空”的类型
  • 分享我用@Entity注释的类
  • 你能分享你用@Entity注释的Entity类吗?

标签: android sqlite android-sqlite android-room


【解决方案1】:

对你的类进行修改,如下所示。

@Entity(tableName = "item")
data class Item(
   @PrimaryKey
   val id: String?,
   @ColumnInfo(typeAffinity = ColumnInfo.BLOB)
   val a_type: String?
   )

这将起作用,因为从错误中可以看出您的旧数据库架构具有 name='a_type', type='BLOB',因此您需要添加 @ColumnInfo(typeAffinity = ColumnInfo.BLOB) 这将指示房间将“a_type”的数据类型视为 BLOB。

最近我注意到@ColumnInfo 还提供“UNDEFINED”作为类型关联,因此您现在可以声明没有任何类型的表字段。Documentation

请尝试在您的项目中进行更新。

@Entity(tableName = "item")
data class Item(
@PrimaryKey
val id: String?,
@ColumnInfo(typeAffinity = ColumnInfo.UNDEFINED)
val a_type: String?
)

【讨论】:

  • 对不起,它不起作用。我的旧数据库模式的类型为 ``(空)。查看错误消息中的最后一行
  • 提供了基于错误的解决方案。您的错误表明您以前的数据库架构具有 a_type 的 blob,而您的新架构的 a_type 具有空类型。
  • 你能告诉我你使用的房间版本吗?
【解决方案2】:

Sqlite 不允许编辑架构。因此,唯一可能的方法是使用正确的列信息创建新表,将数据移动到其中,删除旧表。

这是我使用的代码示例

        database?.execSQL("create table table_name_tmp ( " +
            " id text not null primary key"
            ")")
        database?.execSQL("""
            insert into table_name_tmp (id)

            select id
            from table_name
            """)
        database?.execSQL("drop table table_name")
        database?.execSQL("alter table table_name_tmp rename to table_name")

【讨论】:

    猜你喜欢
    • 2020-09-02
    • 2020-05-17
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 2018-05-13
    • 2021-09-12
    相关资源
    最近更新 更多