2017-09-12 1 views
0

방을 현재 응용 프로그램에서 사용하기로 결정했습니다. 현재 스키마에서 한 열에 유형이없고 룸에서 마이그레이션시 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 클래스 :

@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

를 사용하는 코드의 예입니다? – Pinakin

+0

오류는 마이그레이션에서 데이터 유형 불일치가 발생했음을 나타냅니다. – Pinakin

+0

@Pinakin 예, 형식이 일치하지 않습니다. 하지만 방에 "비어있는"유형이 없습니다. –

답변

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

아래와 같이 @Entity로 주석 된 클래스를 수정하십시오. 오류에서이 기존 DB 스키마, 유형 = 'BLOB를'이름 = 'a_type'을 가진 것을 볼 수 있기 때문에 당신이 @ColumnInfo를 추가해야하므로

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

이, 작동합니다 (typeAffinity = ColumnInfo.BLOB) 이것은 룸에 "a_type"의 데이터 유형을 BLOB로 간주하도록 지시합니다.

최근 @ColumnInfo도 "Affine"유형으로 "UNDEFINED"를 제공하므로 모든 유형없이 테이블 필드를 선언 할 수 있습니다. Documentation

프로젝트의 변경된 사항을 시험해보십시오.

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

죄송합니다. 작동하지 않습니다. 내 오래된 db 스키마 유형이''(비어 있음)입니다. 오류 메시지의 마지막 줄 참조 –

+0

오류를 기반으로 제공된 솔루션입니다. 귀하의 오류는 이전 db 스키마가 a_type에 대해 빈 유형을 갖는 a_type에 대해 blob을 가지고 있음을 나타냅니다. – Pinakin

+0

사용하신 방 버전을 알려 주실 수 있습니까? – Pinakin