Миграция комнаты Android с версии 2–4?

Я пытаюсь перенести базу данных Room из версий 2 и 3 в 4 следующим образом:

private static final Migration MIGRATION_2_4 = new Migration(2, 4) {
    @Override
    public void migrate(@NonNull @NotNull SupportSQLiteDatabase database) {

        database.execSQL(
                "ALTER TABLE 'market_data' ADD COLUMN 'watch_list_boolean' TEXT NOT NULL DEFAULT '0'");

        database.execSQL("DROP TABLE 'developer_data'");
    }
};

но это не работает, что здесь не так?

0
0
40
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

При всем уважении, вы придерживаетесь консервативного подхода.

Поскольку база данных Room использует Gradle для установки номера версии, ее очень легко изменить.

Таким образом, вместо того, чтобы полагаться на инструменты Gradle и SQLiteDatabase, которые сделают эту работу за вас, используйте версию вашей базы данных в памяти и просто создайте столбец с помощью простого SQL.

Ответ принят как подходящий

Скорее всего, проблема (опубликуйте трассировку стека, чтобы помочь будущим читателям) заключается в том, что ваша БД не сможет выполнять миграции 2-> 3 и 3-> 4.

Таким образом, ваш код будет работать только в том случае, если ваша БД будет обновлена ​​с 2 непосредственно до 4, и выдаст исключение (указывающее, какая миграция отсутствует), если БД будет обновлена ​​​​с 2 до 3 или с 3 до 4.

Лучшей практикой является создание отдельных миграций — 2 в 3 и 3 в 4.

Room будет знать, что нужно выполнить правильные миграции и в правильном порядке (2->3 или 3->4 или 2->3->4):

private static final Migration MIGRATION_2_3 = new Migration(2, 3) {
    @Override
    public void migrate(@NonNull @NotNull SupportSQLiteDatabase database) {
        database.execSQL(
                "ALTER TABLE 'market_data' ADD COLUMN 'watch_list_boolean' TEXT NOT NULL DEFAULT '0'");
    }
};

private static final Migration MIGRATION_3_4 = new Migration(3, 4) {
    @Override
    public void migrate(@NonNull @NotNull SupportSQLiteDatabase database) {
        database.execSQL("DROP TABLE 'developer_data'");
    }
};

Не забудьте обновить версию БД :)

Возможно, отредактируйте свой ответ, чтобы объяснить, что Миграция (2,4) будет мигрировать только в том случае, если база данных (старая версия) имеет значение 2, а версия приложения (новая версия) — 4. Она не будет мигрировать с 3 на 4, что, вероятно, проблема, с которой сталкивается плакат.

MikeT 22.03.2022 06:58

Согласен, спасибо за отзыв

Shlomi Katriel 22.03.2022 07:07

Это сработало, большое спасибо!

james fields 22.03.2022 07:07

Пожалуйста :)

Shlomi Katriel 22.03.2022 07:12

Другие вопросы по теме