房间迁移测试MigrationTestHelper版本



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

@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

好吧,我终于找到了它。看起来在我的资产文件夹中生成了一个错误的架构。

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

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

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

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

希望这会有所帮助。

相关内容

  • 没有找到相关文章

最新更新