Posts tagged ‘SQLite delete column’

SQLite对SQL标准支持的也不是很好,特别是删除列就没有。不过有个变通的办法就是按照需要的列重新创建个表,然后移动数据。这个操作对数据条数多的是比较费时的,下面的代码是在国外网站上找到后,修改了下,使它可以保持了原来表格的字段的数据类型,在这里我抛出个问题,AIR 的SQLite可以支持 default 值吗?得找下答案,或者自己实验下。

public function deleteColumn(aTableName:String, columnName:String):void {
            //列出数据库中所有的表
            sqlConn.loadSchema();
            var result:SQLSchemaResult=sqlConn.getSchemaResult();
            var tables:Array=result.tables;

            //找指定的表,并得到表的结构
            var categoryTable:SQLTableSchema;
            for(var j:int=0; j < tables.length; j++) {
                if (tables[j].name == aTableName) {
                    categoryTable=tables[j];
                }
            }
            //创建指定的表的结构的数组
            var columns:Array=categoryTable.columns;
            //第一个数组存放字段名(除去了要删除的字段名)
            //第二个数组存放字段名和字段的相关格式(除去了要删除的字段名)
            var columNames:Array=[];
            var columNames1:Array=[];
            for(var k:int=0; k < columns.length; k++) {
                if (columns[k].name != columnName) {
                    columNames.push(columns[k].name);
                    columNames1.push(getColumnSqlStr(columns[k]));
                }
            }
            //创建一个临时表。
            query("CREATE TABLE IF NOT EXISTS tempabcd (" + columNames1+")");

            //将原表中的数据移到新的表中
            query("INSERT INTO temp SELECT " + String(columNames) + " FROM "+ aTableName);
            //删除原来的表
            query("DROP TABLE " + aTableName);
            //将临时表改名为原来的表名。
            query("ALTER TABLE tempabcd RENAME TO " + aTableName);
        }

        /**
         * 得到相关的列的列属性的字符串表达式,供create table使用;
         * @param column 列对象
         * @return  返回列属性的字符串表达式
         *
         */

        private function getColumnSqlStr(column:SQLColumnSchema):String{
            var str:String=" ";
            str+=column.name;
            str+=" "+column.dataType;
            if(column.primaryKey){
                str+=" PRIMARY KEY";
            }
            if(column.autoIncrement){
                str+=" AUTOINCREMENT";
            }
            if(!column.primaryKey && !column.allowNull){
                str+="  not null";
            }
            return str;
        }

        private function query(sql:String):SQLResult {
            sqlStmt.text=sql;
            sqlStmt.execute();
            if (sqlStmt.getResult().data != null) {
                return sqlStmt.getResult();
            } else {
                return null;
            }
        }