Миграция баз данных - это процесс обновления структуры базы данных при изменении требований приложения без потери существующих данных.
Изменение схемы БД:
Сохранение пользовательских данных:
Обеспечение бесперебойной работы:
// Пример миграции с версии 1 на 2
val MIGRATION_1_2 = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE users ADD COLUMN last_login INTEGER")
}
}
// Применение миграции
Room.databaseBuilder(context, AppDatabase::class.java, "database-name")
.addMigration(MIGRATION_1_2)
.build()
Последовательные миграции:
Прямая миграция:
// Прямая миграция с 1 на 3
val MIGRATION_1_3 = object : Migration(1, 3) {
override fun migrate(database: SupportSQLiteDatabase) {
// Все изменения от 1 до 3
}
}
override fun migrate(database: SupportSQLiteDatabase) {
// 1. Создать временную таблицу
database.execSQL("CREATE TABLE users_new (...)")
// 2. Скопировать данные
database.execSQL("INSERT INTO users_new SELECT * FROM users")
// 3. Удалить старую таблицу
database.execSQL("DROP TABLE users")
// 4. Переименовать новую таблицу
database.execSQL("ALTER TABLE users_new RENAME TO users")
}
// В AutoMigration указываем измененные таблицы
@Database(
version = 2,
entities = [User::class],
autoMigrations = [
AutoMigration (from = 1, to = 2)
]
)
abstract class AppDatabase : RoomDatabase()
Преимущества:
Не указана миграция:
Несовместимые изменения:
Потеря данных:
@Test
fun testMigration1To2() {
val helper = MigrationTestHelper(
InstrumentationRegistry.getInstrumentation(),
AppDatabase::class.java
)
// Открываем БД версии 1
val db = helper.createDatabase("test", 1)
// Заполняем тестовыми данными
db.execSQL("INSERT INTO users (...) VALUES (...)")
db.close()
// Проверяем миграцию
helper.runMigrationsAndValidate("test", 2, true, MIGRATION_1_2)
// Проверяем данные после миграции
val migratedDb = Room.databaseBuilder(...).build()
// Assert проверки
}
Миграции в Room необходимы для безопасного изменения структуры базы данных между версиями приложения. Они позволяют:
Правильно реализованные миграции - критически важный компонент для любого приложения, работающего с локальным хранилищем данных.