如何在SQLite中替换表

时间:2016-03-15 02:15:03

标签: android database sqlite

我尝试进行数据库迁移,删除表并在Android应用程序内的其中一列上添加唯一限制。

我创建了新表,将原始值中的值复制到新表中,删除旧表,然后将新表重命名为与旧表相同的名称。

问题是,现在当我在数据库中查询原始表名中的值时,我从所谓的删除表中获取结果,而不是重命名的新表。

除了重命名新表以便验证所有内容都已正确连接外,我还尝试过所有操作。我看到具有正确列的新表。但是查询旧表会给出有效的响应而不是错误,因为表格不存在"。

这是在我正在设置数据库,调用onUpgrade,然后查询状态的测试中发生的。

重申:

  1. 使用第1,2,3列
  2. 创建表A.
  3. 使用第1,2,4,5列
  4. 创建表B.
  5. 将行从表A复制到表B,删除第3列并具有 第4列和第5列的默认值。
  6. 删除表A
  7. 将表B重命名为表A
  8. 在查询表A时获取包含第1,2,3列的条目
  9. 替代:

    • 跳过第5步
    • 仍然可以查询表A和表B

    我是否需要执行某种刷新以使删除的表实际丢弃?

    /* 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");
    

    感谢。

1 个答案:

答案 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;
  }
}