Я получаю противоречивые результаты между двумя методами чтения столбцов в базе данных Android SQLite.
Во-первых, это часть процедуры обновления базы данных согласно принятому здесь ответу: Обновление базы данных SQLiteиз одной версии в другую?
Этот метод предполагает удаление текущей таблицы с временным именем, создание новой таблицы с новой схемой, а затем копирование соответствующих данных из старой таблицы в новую.перед удалением старой временной таблицы.
Особая проблема у меня возникает, когда я удаляю столбец из схемы.Таким образом, в старой версии таблицы существует определенный столбец, но не в новой.
Этот ответ предполагает использование такого метода для вывода списка столбцов в таблице:
/**
* 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);
В чем причина разных результатов?