Android数据库奇怪列出列

时间:2011-04-21 10:48:20

标签: android database sqlite

我在两个读取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);

不同结果的原因是什么?

2 个答案:

答案 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)

我从来没有深究这一点。我刚刚使用了我提到的第二种方法,但没有出现问题。