例如,我的数据库文件中有一个名为myTable
的表(Android,不支持列重命名,删除等操作。)
此表有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
序列