【问题标题】:Room migration testing MigrationTestHelper version房间迁移测试 MigrationTestHelper 版本
【发布时间】:2020-08-19 01:43:52
【问题描述】:

好吧,我正在尝试测试我的数据库迁移。不幸的是,有些事情看起来不对劲。

@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 类,然后再次开始我的 junit 测试。

谁能帮帮我?

我在这里遵循谷歌指南:https://developer.android.com/training/data-storage/room/migrating-db-versions.html

【问题讨论】:

    标签: android android-room database-migration android-testing


    【解决方案1】:

    嗯,我终于找到了。我的资产文件夹中似乎生成了错误的架构。

    为了解决这个问题,这就是我所做的。

    1. 从 assets 文件夹中删除 1.json 和 2.json 文件(每个文件都包含数据库版本的结构)
    2. 回滚到版本 1 数据库(在我的代码中),构建 > make projet
    3. 您将在资产文件夹中看到 1.json
    4. 进行了更改,我的意思是在我的 Table.java 文件中添加我的新列
    5. 构建 > 制作项目
    6. 您将在资产文件夹中看到 2.json
    7. 运行 junit 测试,现在可以工作了

    这是我的 java 对象和数据库版本 1 和 2 之间的区别

    @Entity(tableName = "Table")
    public class Table implements Parcelable {
    
        @ColumnInfo(name = COLUMN_REFERENCE_CODE)
        private String referenceCode;
    }
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2021-12-11
      • 2021-09-12
      • 1970-01-01
      • 2020-10-03
      • 2020-09-15
      • 2020-05-17
      • 2019-02-13
      • 2018-02-20
      • 1970-01-01
      相关资源
      最近更新 更多