Allow destructive migrations for WorkDatabase.
This will kick in when the developer downgrades
their version of WorkManager and the downward
migration is no longer present in the code.
Bug: 110416954
Test: Ran tests
Change-Id: I273f2ad8ce757ac82a063d9e562a7b220f9ef705
diff --git a/work/workmanager/src/androidTest/java/androidx/work/WorkDatabaseMigrationTest.java b/work/workmanager/src/androidTest/java/androidx/work/WorkDatabaseMigrationTest.java
index c131117..ba4c5f3 100644
--- a/work/workmanager/src/androidTest/java/androidx/work/WorkDatabaseMigrationTest.java
+++ b/work/workmanager/src/androidTest/java/androidx/work/WorkDatabaseMigrationTest.java
@@ -159,91 +159,6 @@
database.close();
}
- @Test
- @MediumTest
- public void testMigrationVersion2To1() throws IOException {
- SupportSQLiteDatabase database =
- mMigrationTestHelper.createDatabase(TEST_DATABASE, NEW_VERSION);
-
- String workSpecId1 = UUID.randomUUID().toString();
- String workSpecId2 = UUID.randomUUID().toString();
-
- // insert SystemIdInfo
- database.execSQL(INSERT_SYSTEM_ID_INFO, new Object[]{workSpecId1, 1});
- database.execSQL(INSERT_SYSTEM_ID_INFO, new Object[]{workSpecId2, 2});
-
- database.close();
-
-
- database = mMigrationTestHelper.runMigrationsAndValidate(
- TEST_DATABASE,
- OLD_VERSION,
- VALIDATE_DROPPED_TABLES,
- WorkDatabaseMigrations.MIGRATION_2_1);
-
- Cursor cursor = database.query(CHECK_ALARM_INFO);
- assertThat(cursor.getCount(), is(2));
- cursor.moveToFirst();
- assertThat(cursor.getString(cursor.getColumnIndex(COLUMN_WORKSPEC_ID)), is(workSpecId1));
- assertThat(cursor.getInt(cursor.getColumnIndex(COLUMN_ALARM_ID)), is(1));
- cursor.moveToNext();
- assertThat(cursor.getString(cursor.getColumnIndex(COLUMN_WORKSPEC_ID)), is(workSpecId2));
- assertThat(cursor.getInt(cursor.getColumnIndex(COLUMN_ALARM_ID)), is(2));
- cursor.close();
-
- assertThat(checkExists(database, TABLE_SYSTEM_ID_INFO), is(false));
- assertThat(checkExists(database, TABLE_WORKSPEC), is(true));
- assertThat(checkExists(database, TABLE_WORKTAG), is(true));
- assertThat(checkExists(database, TABLE_WORKNAME), is(true));
- database.close();
- }
-
- @Test
- @MediumTest
- public void testMigrationVersion1To2To1() throws IOException {
- SupportSQLiteDatabase database =
- mMigrationTestHelper.createDatabase(TEST_DATABASE, OLD_VERSION);
-
- String workSpecId1 = UUID.randomUUID().toString();
- String workSpecId2 = UUID.randomUUID().toString();
-
- // insert alarmInfos
- database.execSQL(INSERT_ALARM_INFO, new Object[]{workSpecId1, 1});
- database.execSQL(INSERT_ALARM_INFO, new Object[]{workSpecId2, 2});
-
- database.close();
-
- database = mMigrationTestHelper.runMigrationsAndValidate(
- TEST_DATABASE,
- NEW_VERSION,
- VALIDATE_DROPPED_TABLES,
- WorkDatabaseMigrations.MIGRATION_1_2);
-
- database.close();
-
- database = mMigrationTestHelper.runMigrationsAndValidate(
- TEST_DATABASE,
- OLD_VERSION,
- VALIDATE_DROPPED_TABLES,
- WorkDatabaseMigrations.MIGRATION_2_1);
-
- Cursor cursor = database.query(CHECK_ALARM_INFO);
- assertThat(cursor.getCount(), is(2));
- cursor.moveToFirst();
- assertThat(cursor.getString(cursor.getColumnIndex(COLUMN_WORKSPEC_ID)), is(workSpecId1));
- assertThat(cursor.getInt(cursor.getColumnIndex(COLUMN_ALARM_ID)), is(1));
- cursor.moveToNext();
- assertThat(cursor.getString(cursor.getColumnIndex(COLUMN_WORKSPEC_ID)), is(workSpecId2));
- assertThat(cursor.getInt(cursor.getColumnIndex(COLUMN_ALARM_ID)), is(2));
- cursor.close();
-
- assertThat(checkExists(database, TABLE_SYSTEM_ID_INFO), is(false));
- assertThat(checkExists(database, TABLE_WORKSPEC), is(true));
- assertThat(checkExists(database, TABLE_WORKTAG), is(true));
- assertThat(checkExists(database, TABLE_WORKNAME), is(true));
- database.close();
- }
-
private boolean checkExists(SupportSQLiteDatabase database, String tableName) {
Cursor cursor = null;
try {
diff --git a/work/workmanager/src/main/java/androidx/work/impl/WorkDatabase.java b/work/workmanager/src/main/java/androidx/work/impl/WorkDatabase.java
index e5d5f9d..379660a 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/WorkDatabase.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/WorkDatabase.java
@@ -97,7 +97,7 @@
}
return builder.addCallback(generateCleanupCallback())
.addMigrations(WorkDatabaseMigrations.MIGRATION_1_2)
- .addMigrations(WorkDatabaseMigrations.MIGRATION_2_1)
+ .fallbackToDestructiveMigration()
.build();
}
diff --git a/work/workmanager/src/main/java/androidx/work/impl/WorkDatabaseMigrations.java b/work/workmanager/src/main/java/androidx/work/impl/WorkDatabaseMigrations.java
index 82a26ac..e52d8ff 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/WorkDatabaseMigrations.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/WorkDatabaseMigrations.java
@@ -42,22 +42,11 @@
+ " INTEGER NOT NULL, PRIMARY KEY(`work_spec_id`), FOREIGN KEY(`work_spec_id`)"
+ " REFERENCES `WorkSpec`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )";
- private static final String CREATE_ALARM_INFO =
- "CREATE TABLE IF NOT EXISTS `alarmInfo` (`work_spec_id` TEXT NOT NULL, `alarm_id`"
- + " INTEGER NOT NULL, PRIMARY KEY(`work_spec_id`), FOREIGN KEY"
- + "(`work_spec_id`) REFERENCES `WorkSpec`(`id`) ON UPDATE CASCADE ON DELETE "
- + "CASCADE )";
-
private static final String MIGRATE_ALARM_INFO_TO_SYSTEM_ID_INFO =
"INSERT INTO SystemIdInfo(work_spec_id, system_id) "
+ "SELECT work_spec_id, alarm_id AS system_id FROM alarmInfo";
- private static final String MIGRATE_SYSTEM_ID_INFO_TO_ALARM_INFO =
- "INSERT INTO alarmInfo(work_spec_id, alarm_id) "
- + "SELECT work_spec_id, system_id AS alarm_id FROM SystemIdInfo";
-
private static final String REMOVE_ALARM_INFO = "DROP TABLE IF EXISTS alarmInfo";
- private static final String REMOVE_SYSTEM_ID_INFO = "DROP TABLE IF EXISTS SystemIdInfo";
/**
* Removes the {@code alarmInfo} table and substitutes it for a more general
@@ -74,18 +63,4 @@
+ "SELECT worker_class_name AS tag, id AS work_spec_id FROM workspec");
}
};
-
- /**
- * Removes the {@code alarmInfo} table and substitutes it for a more general
- * {@code SystemIdInfo} table.
- */
- public static Migration MIGRATION_2_1 = new Migration(VERSION_2, VERSION_1) {
- @Override
- public void migrate(@NonNull SupportSQLiteDatabase database) {
- database.execSQL(CREATE_ALARM_INFO);
- database.execSQL(MIGRATE_SYSTEM_ID_INFO_TO_ALARM_INFO);
- database.execSQL(REMOVE_SYSTEM_ID_INFO);
- // Don't remove implicit tags; they may have been added by the developer.
- }
- };
}