我决定在我目前的申请中使用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
)
有什么方法可以解决这个问题吗?
答案 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?
)