复制具有混合列顺序的sqlite表

时间:2019-06-20 09:01:35

标签: sqlite android-sqlite

我正在尝试将所有数据从sqlite表复制到另一个表(原因是更改主键,建议的方法是创建新表,复制数据,重命名等)。 沿途:

insert into new_table select * from old_table;
drop old_table;
alter table new_table rename to old_table;

现在的问题是,有时当我创建新表时,它的列顺序是不相同的,并且数据被完全弄乱了。不知道为什么,可能导致某些人拥有全新的表,而有些人具有旧表,这些表的升级脚本很少。无论如何,我要确保每一列都插入正确的列中。我可以确定只是手动命名所有列,但是即使以后再添加一些列以及为其他表添加列,我也希望这样做。我可能可以以某种方式查询列的名称,然后以我上面使用的语言(kotlin)构造查询,但是如果可能的话,我想在数据库级别执行此操作。

它在android上,但与问题不是很相关:) 谢谢!

1 个答案:

答案 0 :(得分:0)

不幸的是,我不得不添加1个额外的查询来获取列。 其他查询都特别提到了所有列,而不是使用星号来确保正确的顺序。我的科特林方式:

        fun columns(db: SQLiteDatabase, tableName: String): List<String> {
            val sql = "pragma table_info($tableName)"
            return db.rawQuery(sql, arrayOf()).use { cursor ->
                (1..cursor.count).map {
                    cursor.moveToNext()
                    cursor.getString(cursor.getColumnIndexOrThrow("name"))
                }
            }
        }

        fun copyFromTableToTable(db: SQLiteDatabase, originalTableName: String, backupTableName: String) {
            val columns = columns(db, backupTableName).joinToString(separator = ",")
            db.execSQL("""INSERT INTO $backupTableName
                ($columns)
                SELECT $columns FROM $originalTableName
                """.trimMargin())
            //db.execSQL("DROP TABLE $originalTableName;")
            //db.execSQL("ALTER TABLE $backupTableName RENAME TO $originalTableName;")
        }