我尝试进行数据库迁移,删除表并在Android应用程序内的其中一列上添加唯一限制。
我创建了新表,将原始值中的值复制到新表中,删除旧表,然后将新表重命名为与旧表相同的名称。
问题是,现在当我在数据库中查询原始表名中的值时,我从所谓的删除表中获取结果,而不是重命名的新表。
除了重命名新表以便验证所有内容都已正确连接外,我还尝试过所有操作。我看到具有正确列的新表。但是查询旧表会给出有效的响应而不是错误,因为表格不存在"。
这是在我正在设置数据库,调用onUpgrade,然后查询状态的测试中发生的。
重申:
替代:
我是否需要执行某种刷新以使删除的表实际丢弃?
/* Create table_a */
/* Populate table_a */
/* Create table_b */
/* Copy table_a contents to table_b */
db.execSQL("DROP TABLE IF EXISTS table_a");
db.execSQL("ALTER TABLE table_b RENAME TO table_a");
感谢。
答案 0 :(得分:1)
在过去的几天里,以及一些不同的工程师在工作中工作了大约8个小时。对不起,我无法分享所有细节,但我会与其他可能遇到相同或类似问题的人分享我能做的事。
假设:GoogleRobolectricTestRunner使用与实际设备不同的后备数据库,并导致测试内部出现缓存问题。仍需要在真实设备上进行测试以验证。
除了尝试获取新表中的列名外,对新表的所有查询都按预期工作。最初我用以下方法做到了这一点:
// DID NOT WORK
public static Collection<String> getTableColumnNames(
final SQLiteDatabase db, String tableName) {
try (Cursor cursor = db.query(tableName, null, null, null, null, null, null)) {
return Arrays.asList(cursor.getColumnNames());
}
}
此方法始终返回旧删除表的列名。最终决定改变我们获取列名的方式,其余测试成功。
public static Collection<String> getTableColumnNames(
final SQLiteDatabase db, String tableName) {
Set<String> columnNames = new HashSet<>();
try (Cursor cursor = db.rawQuery("PRAGMA table_info(" + tableName + ")", null)) {
if (cursor.moveToFirst()) {
do {
columnNames.add(cursor.getString(1));
} while (cursor.moveToNext());
}
return columnNames;
}
}