我在两个读取Android SQLite数据库中的列的方法之间得到了不一致的结果。
首先,根据此处接受的答案,这是数据库升级例程的一部分:Upgrade SQLite database from one version to another?
该技术涉及使用临时名称移动当前表,使用新架构创建新表,然后在删除旧临时表之前将旧表中的相关数据复制到新表中。
我遇到的特殊问题是从架构中删除列时。因此,旧版本的表中存在特定列,但不存在新列。
该答案建议使用这样的方法列出表格中的列:
/**
* Returns a list of the table's column names.
*/
private List<String> getColumns(SQLiteDatabase db, final String tableName) {
List<String> ar = null;
Cursor c = null;
try {
c = db.rawQuery("SELECT * FROM " + tableName + " LIMIT 1", null);
if (c != null) {
ar = new ArrayList<String>(Arrays.asList(c.getColumnNames()));
}
} finally {
if (c != null)
c.close();
}
return ar;
}
在我用旧临时名称将其移走之前在旧桌面上工作正常并替换它。当我稍后再次运行相同的查询时,在新创建的空表上,它仍然列出旧表模式,其中包含不再存在的列的名称。它看起来好像在重用该查询的过时缓存结果。
如果我以不同的方式读取列,请使用此列,然后按预期返回新的列列表:
private void listColumns(SQLiteDatabase db, final String tableName) {
final String query = "PRAGMA table_info(" + tableName + ");";
Cursor c = db.rawQuery(query, null);
while (c.moveToNext()) {
Log.v("MyApp", "Column: " + c.getString(1));
}
c.close();
}
完整的序列是:
final String tempTableName = "temp_" + tableName;
table.addToDb(db); // ensure it exists to start with
// get column names of existing table
final List<String> columns = getColumns(db, tableName);
// backup table
db.execSQL("ALTER TABLE " + tableName + " RENAME TO " + tempTableName);
// create new table
table.addToDb(db);
// delete old columns which aren't in the new schema
columns.retainAll(getColumns(db, tableName));
// restore data from old into new table
String columnList = TextUtils.join(",", columns);
db.execSQL(String.format("INSERT INTO %s (%s) SELECT %s from %s", tableName, columnList, columnList,
tempTableName));
// remove backup
db.execSQL(DROP_TABLE + tempTableName);
不同结果的原因是什么?
答案 0 :(得分:0)
我假设你做了类似的事情:
ALTER TABLE "main"."mytable" RENAME TO "newtable";
CREATE TABLE "main"."mytable" ("key1" text PRIMARY KEY,"key2" text,"key3" text);
INSERT INTO "main"."mytable" SELECT "key1","key2","key3" FROM "main"."newtable";
DROP TABLE "main"."newtable";
如果有,请分享等效代码,以排除此部分的任何错误。
答案 1 :(得分:0)
我从来没有深究这一点。我刚刚使用了我提到的第二种方法,但没有出现问题。