Комната: java.lang.IllegalStateException: миграция не была правильно для существующей базы данных - PullRequest
0 голосов
/ 24 июня 2018

Используемая версия номера: - 1.1.1-rc1

У меня была существующая база данных, которая реализована с помощью ormlite. Я пытаюсь перейти на Room с существующим файлом sqlite, созданным ormlite.

Когда мы использовали длинный тип данных для столбца таблицы в ormlite, он покрывается BIGINT в sqlite. поэтому созданная схема содержит столбец типа BIGINT, тип которого неизвестен для room. Когда я пытаюсь обновить приложение с Room, я получаю исключение миграции.

java.lang.IllegalStateException: миграция выполнена неправильно

Process: com.sample.playground, PID: 5587
java.lang.IllegalStateException: Migration didn't properly handle SampleReports(com.sample.playground.model.SampleReport
 Expected:
TableInfo{name='SampleReports', columns={timeslot=Column{name='timeslot', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}, environment=Column{name='environment', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0}, timestamp=Column{name='timestamp', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}, trigger=Column{name='trigger', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}, imeisvSvn=Column{name='imeisvSvn', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, _id=Column{name='_id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1}}, foreignKeys=[], indices=[]}
 Found:
TableInfo{name='SampleReports', columns={environment=Column{name='environment', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0}, timeslot=Column{name='timeslot', type='BIGINT', affinity='3', notNull=true, primaryKeyPosition=0}, trigger=Column{name='trigger', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}, timestamp=Column{name='timestamp', type='BIGINT', affinity='3', notNull=true, primaryKeyPosition=0}, _id=Column{name='_id', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=1}}, foreignKeys=[], indices=[]}
    at com.sample.playground.model.SampleReport.SampleReportRoomDbHelper_Impl$1.validateMigration(SampleReportRoomDbHelper_Impl.java:77)
    at android.arch.persistence.room.RoomOpenHelper.onUpgrade(RoomOpenHelper.java:87)
    at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.onUpgrade(FrameworkSQLiteOpenHelper.java:133)
    at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:256)
    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
    at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworkSQLiteOpenHelper.java:96)
    at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.java:54)
    at android.arch.persistence.room.RoomDatabase.query(RoomDatabase.java:233)
    at com.sample.playground.model.SampleReportDao_Impl.getReports(SampleReportDao_Impl.java:300)

Пробовал с TypeConverter, используя BigInteger, но он не работал.

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Проверить этот ответ https://stackoverflow.com/a/52127819/7433710 Эта ошибка возникает из-за того, что типы данных не совпадают или наиболее распространенное целое число, а не нуль, не указано в более ранней таблице Sqlite, и вы пытаетесь инициализировать, добавив переменную int. Обязательно добавьте NOT NULL во все столбцы int.

Проверьте разницу, которую я получил, используя ваш вывод logcat по ссылке ниже. Недостаточно репутации для публикации изображений: (* ​​1005 *

Сравнение с использованием вывода logcat

Полное изображение разницы

0 голосов
/ 25 июня 2018

Я думаю, вам необходимо соответствующим образом преобразовать таблицу, переопределив метод migrate, чтобы он - создает промежуточную таблицу на основе ожидаемых столбцов, - копирует данные в промежуточную таблицу, - опускает исходный стол и - затем меняет имя промежуточной таблицы на исходное имя

Например, на основании: -

DROP TABLE IF EXISTS SampleReports_intermediate;
CREATE TABLE IF NOT EXISTS SampleReports_intermediate (
    timeslot INTEGER NOT NULL, 
    environment TEXT NOT NULL,
    timestamp INTEGER NOT NULL,
    `trigger` INTEGER NOT NULL,
    imeisvSvn TEXT,
    _id INTEGER PRIMARY KEY
);
INSERT INTO SampleReports_intermediate (environment, timeslot, `trigger`, timestamp, _id)
    SELECT environment, timeslot,`trigger`, timestamp, _id FROM SampleReports
;
DROP TABLE IF EXISTS SampleReports;
ALTER TABLE SampleReports_intermediate RENAME TO SampleReports;

Если вы не используете комнату 1.1, попробуйте использовать ее так: -

В комнате 1.1 добавлена ​​поддержка типов Sqlite, которых не было в комнате

Миграция базы данных комнат неправильно обработала преобразование

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...