2017-09-12 7 views
0

私の現在のアプリケーションでルームを使用することに決めました。 現在のスキーマに1つの列の型がないことを確認し、マイグレーション時にルームで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も型親和として「UNDEFINED」を提供することを私の注意に来ます。 Documentation

プロジェクトの更新された変更をお試しください。

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

申し訳ありませんが、動作しません。私の古いdbスキーマは ''(空)型です。エラーメッセージの最後の行を参照してください –

+0

エラーに基づいて提供された解決策。あなたのエラーは、あなたの新しいスキーマがa_typeのための空の型を有するいる場合、以前のDBスキーマがa_typeためのブロブを持っていることを示すされています。 – Pinakin

+0

あなたが使った部屋のバージョンを教えてもらえますか? – Pinakin

関連する問題