无法迁移到会议室

时间:2017-09-12 03:02:57

标签: android sqlite android-sqlite android-room

我决定在我目前的申请中使用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
)

有什么方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

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")

答案 1 :(得分:0)

修改使用@Entity注释的班级,如下所示。

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

这样可以正常工作,因为从错误中可以看出您的旧数据库架构名称为' a_type',type =' BLOB',因此您需要添加@ColumnInfo( typeAffinity = ColumnInfo.BLOB)这将指示房间考虑" a_type"的数据类型。作为BLOB。

最近我注意到@ColumnInfo也提供了" UNDEFINED"作为类型Affinity,您现在可以声明您的表字段没有任何类型。Documentation

请尝试更新项目中的更新。

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