游标在“查询,删除表,创建表,查询同一表名”之后返回相同的列

时间:2019-02-24 10:45:00

标签: android sqlite

例如,我的数据库文件中有一个名为myTable的表(Android,不支持列重命名,删除等操作。)

此表有idxname

我要删除并重新创建此表,但要添加新列

这是我的方法:

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不会返回新列(idtitle

它返回旧列(例如idxname

尽管当我关闭应用程序并再次打开时,一切正常(旧列消失了,新列可用了)

太烦人了!

因此,在所有过程中都可以在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返回新列idtitle

这太疯狂了!

所以看来query table1drop table1create table1query table1顺序会导致意外的行为

我们只能执行drop table1create table1query table1序列

0 个答案:

没有答案