Курсор возвращает те же столбцы после «Запрос, Удалить таблицу, Создать таблицу, Запрос для того же имени таблицы» - PullRequest
0 голосов
/ 24 февраля 2019

Например, в моем файле базы данных есть таблица с именем myTable (Android, ps не поддерживает переименование, удаление и т. Д. Столбцов).

В этой таблице idx, name столбцы

Я хочу удалить и заново создать эту таблицу, но с новыми столбцами

Вот как я это делаю:

db.transaction {
    var cursor = query("myTable", null, null, null, null, null, null)
    // save info to a list and insert it later to a recreated table with new columns
    cursor.close()

    // delete table "myTable"
    execSQL("DROP TABLE IF EXISTS myTable")

    // create table "myTable" but with new columns
    execSQL("CREATE TABLE myTable(id, title)")

    // get columns
    cursor = query("myTable", null, null, null, null, null, null)
    val columnNames = cursor.columnNames
    cursor.close()
    Log.i(TAG, "columns of new table ${Arrays.toString(columnNames)}")
}

Но cursor.columnNames не возвращает новыйстолбцы (id, title)

Возвращает старые столбцы (например, idx, name)

Хотя, когда я закрываю приложение и открываю снова, все в порядке(старые столбцы исчезли, а новые доступны)

Так раздражает!

Таким образом, новые столбцы создаются нормально в main.db/myTable в течение всего этого процесса, но кажется, что приложение все еще сохраняет старые столбцы в памяти

Я даже не могу использовать cursor.getString(cursor.getColumnIndex("title")) (вернул бы -1), потому что он все еще думает, что этот столбец еще не существует, пока я не перезапущу это приложение

НО!Воссоздание таблицы с новыми столбцами работает нормально, если я не использую cursor для резервного копирования данных (информации) перед удалением старой таблицы

db.transaction {
    // !! I COMMENTED THESE LINES
    // var cursor = query("myTable", null, null, null, null, null, null)
    // save info to a list and insert it later to a recreated table with new columns
    // cursor.close()

    // delete table "myTable"
    execSQL("DROP TABLE IF EXISTS myTable")

    // create table "myTable" but with new columns
    execSQL("CREATE TABLE myTable(id, title)")

    // get columns
    cursor = query("myTable", null, null, null, null, null, null)
    val columnNames = cursor.columnNames
    cursor.close()
    Log.i(TAG, "columns of new table ${Arrays.toString(columnNames)}")
}

В этом случае cursor.columnNames возвращает новые столбцы id, title

Это безумие!

Так что, похоже, последовательность query table1, drop table1, create table1, query table1 приведет к неожиданному поведению

И мы можем сделать только drop table1, create table1, query table1 последовательность

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