Ответ
Да, работал с миграцией БД в Room. Миграция нужна при изменении структуры БД (добавление/удаление таблиц, колонок и т.д.). В Room для этого используется Migration:
val MIGRATION_1_2 = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE users ADD COLUMN last_login INTEGER NOT NULL DEFAULT 0")
}
}
Room.databaseBuilder(context, AppDatabase::class.java, "app.db")
.addMigrations(MIGRATION_1_2)
.build()
Важно:
- Указывать правильные версии БД (fromVersion, toVersion)
- Обрабатывать возможные исключения
- Тестировать миграцию перед релизом
- Для сложных изменений можно использовать временные таблицы
Ответ 18+ 🔞
А, ну это же классика, ёпта! С миграциями в Room работал, да. Представь, что твоя база данных — это квартира. Жил-жил, всё норм, а потом бац — женился, детей завёл, теща переехала. Места не хватает, надо перепланировку делать, стенку сносить. Вот миграция — это и есть такой ремонт на ходу, без выселения.
Когда структуру БД меняешь — таблицу новую добавил, колонку какую-нибудь last_login прикрутил, или вообще хуй с горы — старую таблицу нахуй удалил — вот тут без миграции никак. Без неё приложение обновится, откроет БД новой схемы, а она-то осталась со старой — и тут тебе пиздец, IllegalStateException прямо в ебало.
Делается через этот самый Migration объект. Главное — версии не перепутать, а то будет тебе хиросима. Смотри, как это выглядит:
val MIGRATION_1_2 = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE users ADD COLUMN last_login INTEGER NOT NULL DEFAULT 0")
}
}
Room.databaseBuilder(context, AppDatabase::class.java, "app.db")
.addMigrations(MIGRATION_1_2)
.build()
Вот тут (1, 2) — это с какой версии на какую переходим. С первой на вторую. И внутри migrate пишешь свой SQL, который всё и порешает. В примере — просто колонку добавляем.
А теперь, чувак, самые важные моменты, где все и обосрываются, будь добр, запомни:
- Версии — это святое. Указал
(2, 3)— значит, миграция сработает ТОЛЬКО при переходе с двойки на тройку. Если у юзера была версия 1, а ты добавил миграции(1, 2)и(2, 3)— Room сам их по цепочке выполнит. Но если цепочку порвёшь — пиши пропало. - Исключения лови, ёб твою мать! Внутри
migrateоберни свои запросы вtry-catch, если что-то сложное делаешь. А то упадёт посреди процесса — и БД останется в ебенях, в полумигрированном состоянии. Доверие к тебе после этого — ноль ебать. - Протестировать надо, а не на глазок! Перед тем как в продакшн пулять, напиши тест, который создаёт БД старой версии, накатывает миграцию и проверяет, что всё на месте. Иначе можно получить сюрприз, от которого сам от себя охуеешь.
- Для совсем уж диких переделок — когда не просто колонку добавить, а половину схемы перелопатить — используют временные таблицы. Создаёшь новую таблицу по новой схеме, из старой в неё данные перегоняешь, старую удаляешь, новую переименовываешь. Медленно, зато надёжно.
Короче, принцип такой: планируй миграции заранее, тестируй их как последнюю хуйню, и не делай из своей БД подобие франкенштейна с кучей костылей. И всё будет пизда рулю.