gpt4 book ai didi

android - SQLite中如何替换表

转载 作者:搜寻专家 更新时间:2023-10-30 23:40:07 24 4
gpt4 key购买 nike

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

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

问题是,现在当我在数据库中查询原始表名中的值时,我得到的结果来自据称已删除的表,而不是重命名的新表。

除了重命名新表以验证所有内容是否正确连接外,我已经尝试了所有操作。我看到包含正确列的新表。但是查询旧表给了我有效的响应,而不是“表不存在”的错误。

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

重申一下:

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

备用:

  • 跳过第 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");

谢谢。

最佳答案

在过去的几天里,我和几个不同的工程师一起为此工作了大约 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;
}
}

关于android - SQLite中如何替换表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36001509/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com