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;
}
}
//列出数据库中所有的表
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;
}
}
天地会