Например, в моем файле базы данных есть таблица с именем 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
последовательность