2017-09-12 3 views
0

J'ai décidé d'utiliser Room dans mon application actuelle. Déterminez qu'il n'y a pas de type pour une colonne dans le schéma en cours et Room produit IllegalStateException lors de la migration.Impossible de migrer vers la pièce

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}...} 

script Sql de la création de la table:

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

classe Entité:

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

Existe-t-il un moyen de résoudre ce problème?

+0

pouvez-vous s'il vous plaît partager votre nouvelle classe d'entité et ancien schéma ainsi? – Pinakin

+0

Une erreur indique que la non-concordance de type de données s'est produite dans votre migration. – Pinakin

+0

@Pinakin oui, je vois que c'est une incompatibilité de type. Mais il n'y a pas de type "vide" dans la pièce –

Répondre

1

Sqlite ne permet pas d'éditer le schéma. Donc, la seule façon possible est de créer la nouvelle table avec les informations correctes sur les colonnes, de déplacer les données, de supprimer l'ancienne table.

Voici l'exemple du code que je

 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

Modifiez la classe annotée avec @Entity comme ci-dessous.

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

Cela fonctionne, car l'erreur est visible que votre ancien schéma db est d'avoir name = 'a_type', type = 'blob', vous devez donc ajouter @ColumnInfo (typeAffinity = ColumnInfo.BLOB) cela demandera à room de considérer le type de données "a_type" comme BLOB.

Récemment, il a été porté à mon attention que @ColumnInfo fournit également "UNDEFINED" comme type d'affinité, ce qui signifie que vous pouvez maintenant déclarer votre champ de table sans aucun type. Documentation

veuillez essayer les modifications mises à jour dans votre projet.

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

désolé, mais cela ne fonctionne pas. Mon ancien schéma db est de type '' (vide). Voir la dernière ligne du message d'erreur –

+0

Solution fournie basée sur une erreur. Votre erreur indique que votre schéma db précédent a blob pour a_type où votre nouveau schéma a un type vide pour a_type. – Pinakin

+0

Pouvez-vous s'il vous plaît laissez-moi savoir la version de la pièce que vous avez utilisée? – Pinakin