Столбцы списков странностей базы данных Android - PullRequest
2 голосов
/ 21 апреля 2011

Я получаю противоречивые результаты между двумя методами чтения столбцов в базе данных 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);

В чем причина разных результатов?

Ответы [ 2 ]

0 голосов
/ 13 июня 2011

Я никогда не доходил до сути этого.Я только что закончил тем, что использовал второй метод, который я упомянул, который не показывает проблемы.

0 голосов
/ 21 апреля 2011

Полагаю, вы сделали что-то похожее на это:

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";

Если у вас есть, поделитесь эквивалентным кодом, чтобы исключить ошибки в этой части.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...