2017-10-16 10 views
1

Comment migrer un type de champ vide vers du texte dans Room?java.lang.IllegalStateException: la migration n'a pas géré correctement la table

En ce moment je suis face à ce problème:

java.lang.IllegalStateException: La migration ne gère pas correctement data_table

attendu: TableInfo {name = 'data_table', colonnes = url = colonne {name = 'url', type = 'text', notNull = false, primaryKeyPosition = 0} .....

Trouvé: TableInfo {name = 'data_table', colonnes = url = colonne {name = 'url', type = '', notNull = false, primaryKeyPosition = 0} .....

J'ai essayé d'utiliser la UNDEFINED typeAffinity, mais cela n'a aucun effet.

+0

Que possède votre POJO '@ Entity'? Room préfère vraiment les types, et je n'ai pas essayé 'UNDEFINED' - y a-t-il une raison particulière pour laquelle vous essayez d'éviter un type ici? – CommonsWare

+0

Le champ POJO est une chaîne. Nous avons du code hérité qui a créé la colonne sans un type de données. –

+0

La migration des bases de données pré-salles vers Room se heurtera à ce genre de problème. Autre que de faire votre propre migration manuelle d'abord, avant de commencer à appliquer Room, je n'ai aucune idée de la façon de résoudre ce problème. – CommonsWare

Répondre

0

Le problème est lors de la création de la table, le créateur n'a pas indiqué la colonne explicitement. Il y a deux façons d'être choisi pour résoudre le problème.

  1. Vous pouvez créer une nouvelle base de données pendant la migration et copier toutes les anciennes données dans la nouvelle. Comme ça.

    static final Migration MIGRATION_1_2 = new Migration(1, 2) { 
        @Override 
        public void migrate(SupportSQLiteDatabase database) { 
         // Create the new table 
         database.execSQL(
           "CREATE TABLE data_table_new (url TEXT"); 
         // Copy the data 
         database.execSQL(
           "INSERT INTO data_table_new url SELECT url FROM data_table"); 
         // Remove the old table 
         database.execSQL("DROP TABLE data_table"); 
         // Change the table name to the correct one 
         database.execSQL("ALTER TABLE data_table_new RENAME TO data_table"); 
        } 
    }; 
    

Mais il est inefficace lorsque l'on travaille avec un grand db. Donc j'utilise la deuxième façon.

2 Vous migrez la table vers une nouvelle table avec un type de colonne explicite avec votre gestionnaire ou terminal db préféré. Ensuite, mettez le nouveau db dans votre projet.