Библиотека сохраняемости комнаты: странная ошибка во время миграции

Ломаю голову с этой ошибкой. Я не мог найти никакого ответа до сих пор. У меня есть старая база данных, которую я переношу в библиотеку Persistence Room. Однако всякий раз, когда я выполняю миграцию, я получаю следующую ошибку:

java.lang.IllegalStateException: Migration didn't properly handle. 

Код, который я использую, выглядит следующим образом:

@Entity(tableName = ROUTE_TABLE)
public class RouteData {

    static final String ROUTE_TABLE = "name";

    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "id")
    private int id;
    @ColumnInfo(name = "col1")
    private String col1;
    //Other columns with exactly same as 'col1' just different names
    //Getters and Setters
}

Для миграции,

Room.databaseBuilder(context.getApplicationContext(), MyData.class, DATABASE_NAME)
            .addMigrations(MIGRATION_LATEST)
            .fallbackToDestructiveMigration() 
            .build();

private static final Migration MIGRATION_LATEST = new Migration(9, 10) {
    @Override
    public void migrate(SupportSQLiteDatabase db) {
        //Log.i("Tag" , "Migration Started");
        //Migration logic
        //Log.i("Tag" , "Migration Ended");
    }
};

Когда я запускаю программу. Я получаю журнал «Миграция завершена» в своем LogCat, но когда я снова пытаюсь получить доступ к базе данных, это дает мне следующую ошибку.

 Caused by: java.lang.IllegalStateException: Migration didn't properly handle xxx.
                                                                              Expected:
                                                                             TableInfo{name='name', columns={col1=Column{name='col1', type='TEXT', notNull=false, primaryKeyPosition=0}, ....}, foreignKeys=[]}
                                                                              Found:
                                                                             TableInfo{name='name', columns={col1=Column{name='col1', type='INTEGER', notNull=false, primaryKeyPosition=0}, ....}, foreignKeys=[]}

Я понятия не имею, куда идет этот «ЦЕЛОЕ ЧИСЛО». Я попытался удалить, аннулировать кеш и любое другое тесно связанное решение. Есть идеи, что происходит? Он отлично работает, если вы только что установили приложение. Ошибка возникает только после миграции. Согласно моему журналу cat, все шаги миграции, кажется, завершены, но все еще показывает, что миграция не обрабатывается должным образом.


person Dexter    schedule 24.10.2017    source источник
comment
Не могли бы вы добавить свою модель перед миграцией?   -  person José Carlos    schedule 24.10.2017
comment
@JoséCarlos, какая модель?   -  person Dexter    schedule 25.10.2017
comment
ваш класс RouteData   -  person José Carlos    schedule 25.10.2017
comment
@SnehPandya Спасибо за проявленный интерес помочь мне. Однако недавно выяснили настоящую причину, пожалуйста, проверьте ответ :)   -  person Dexter    schedule 14.11.2017
comment
@JoséCarlos Спасибо за проявленный интерес помочь мне. Однако недавно выяснили настоящую причину, пожалуйста, проверьте ответ :)   -  person Dexter    schedule 14.11.2017


Ответы (2)


Спасибо всем за попытку помочь мне, однако я наконец нашел ответ после нескольких дней разочаровывающей отладки. В моем манифесте приложения было включено автоматическое резервное копирование,

Android: разрешить резервное копирование = "истина"

Поэтому, опробовав различные базы данных, Google фактически делал резервные копии всех моих вновь созданных баз данных и их структуры и автоматически восстанавливал их, когда я переустанавливал приложение. Следовательно, я получал эту проводную ошибку. Как только я включу автоматическое резервное копирование android:allowBackup="false" и переустановлю приложение, я смогу правильно протестировать миграцию.

Мое предложение для всех разработчиков, которые в будущем столкнутся с такой проблемой, ОТКЛЮЧИТЬ автоматическое резервное копирование во время разработки. Вы можете включить его после того, как протестируете миграцию.

person Dexter    schedule 14.11.2017
comment
Или перед переустановкой старой версии очистите данные приложения. Settings > Apps > your app > Storage > Clear Data - person StuStirling; 12.01.2018
comment
@StuStirling, в моем случае это не сработало. Google всегда устанавливал мою базу данных в предыдущее состояние при установке новой версии. Следовательно, это создавало проблемы во время миграции. - person Dexter; 14.01.2018

Основная проблема в вашем сценарии миграции приведена ниже:

Caused by: java.lang.IllegalStateException: Migration didn't properly handle xxx.
                                                                              Expected:
                                                                             TableInfo{name='name', columns={col1=Column{name='col1', type='TEXT', notNull=false, primaryKeyPosition=0}, ....}, foreignKeys=[]}
                                                                              Found:
                                                                             TableInfo{name='name', columns={col1=Column{name='col1', type='INTEGER', notNull=false, primaryKeyPosition=0}, ....}, foreignKeys=[]}

Здесь, в вашем классе Entity, у вас есть:

@ColumnInfo(name = "col1")
    private String col1; 

но в вашем запросе на миграцию вы можете добавить col1 как INTEGER

Из вашей ошибки:

Ожидается:

columns={col1=Column{name='col1', type='TEXT', notNull=false, primaryKeyPosition=0}

Найдено :

columns={col1=Column{name='col1', type='INTEGER', notNull=false, primaryKeyPosition=0}

Решение: измените запрос переноса следующим образом:

ИЗМЕНИТЬ ТАБЛИЦУ YOUR_TABLE ДОБАВИТЬ СТОЛБЦУ col1 ТЕКСТ

Это решит вашу проблему.

Спасибо :)

person Md. Sajedul Karim    schedule 09.07.2018