Комнатное миграционное тестирование версии MigrationTestHelper - PullRequest
0 голосов
/ 04 мая 2020

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

@RunWith(AndroidJUnit4ClassRunner.class)
public class MigrationTest {
    private static final String TEST_DB = "migration-test";

    @Rule
    public MigrationTestHelper helper;

    public MigrationTest() {
        helper = new MigrationTestHelper(InstrumentationRegistry.getInstrumentation(),
                AppDatabase.class.getCanonicalName(),
                new FrameworkSQLiteOpenHelperFactory());
    }

    @Test
    public void migrateAll() throws IOException {
        // Create earliest version of the database.
        SupportSQLiteDatabase db = helper.createDatabase(TEST_DB, 1);
        db.close();

        // Open latest version of the database. Room will validate the schema
        // once all migrations execute.
        AppDatabase appDb = Room.databaseBuilder(
                InstrumentationRegistry.getInstrumentation().getTargetContext(),
                AppDatabase.class,
                TEST_DB)
                .addMigrations(ALL_MIGRATIONS).build();
        appDb.getOpenHelper().getWritableDatabase();
        appDb.close();
    }

    // Array of all migrations
    private static final Migration[] ALL_MIGRATIONS = new Migration[]{MIGRATION_1_2};

}

Код миграции.

public static final Migration MIGRATION_1_2 = new Migration(1, 2) {
        @Override
        public void migrate(SupportSQLiteDatabase database) {
            database.execSQL("ALTER TABLE mytable ADD COLUMN reference_code TEXT");

        }
    };

Все отлично работает с реальной миграцией, но в тестовом случае junit у меня появляется следующая ошибка.

E/SQLiteLog: (1) duplicate column name: reference_code
E/TestRunner: failed: migrateAll(com.apps.MigrationTest)
E/TestRunner: ----- begin exception -----
E/TestRunner: android.database.sqlite.SQLiteException: duplicate column name: reference_code (code 1 SQLITE_ERROR): , while compiling: ALTER TABLE mytable ADD COLUMN reference_code TEXT
        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:986)
        at a

Как я понимаю, похоже SupportSQLiteDatabase db = helper.createDatabase(TEST_DB, 1); создает схему V2 моей базы данных (а не версию 1). В результате новый столбец помечается как дубликат.

Чтобы исправить это, я должен откатить свой класс version = 1 до @Database и затем снова запустить мой тест джунта.

Может кто-нибудь помочь я на это?

Я следую руководство Google здесь: https://developer.android.com/training/data-storage/room/migrating-db-versions.html

1 Ответ

0 голосов
/ 04 мая 2020

Ну, я наконец нашел это. Похоже, что в моей папке активов была сгенерирована неправильная схема.

Чтобы исправить проблему, вот что я сделал.

  1. Удалить 1. json и 2. json файлов из папки активов (каждый файл содержит структуру версии базы данных)
  2. Откат к базе данных версии 1 (в моем коде), build> make projet
  3. Вы увидите 1. json в папке с активами
  4. Внесенные мной изменения, я имею в виду добавление моего нового столбца в мою таблицу. java file
  5. Build> make projet
  6. You увидите 2. json в вашей папке ресурсов
  7. Запустите тест junit, работающий сейчас

Вот разница между моим java объектом и базой данных версии 1 и 2

@Entity(tableName = "Table")
public class Table implements Parcelable {

    @ColumnInfo(name = COLUMN_REFERENCE_CODE)
    private String referenceCode;
}

Надеюсь, это поможет.

...