Necesitamos tu apoyo para compartir nuestros artículos en referencia a las ciencias de la computación.
Solución:
ALTERAR TABLA SQLite
SQLite admite un subconjunto limitado de ALTER TABLE. El comando ALTER TABLE en SQLite le permite al usuario cambiar el nombre de una tabla o agregar una nueva columna a una tabla existente. No es posible cambiar el nombre de una columna, eliminar una columna o agregar o eliminar restricciones de una tabla.
Puede:
- cree una nueva tabla como la que está tratando de cambiar,
- copiar todos los datos,
- dejar caer la mesa vieja,
- renombrar el nuevo.
Escribí una implementación de Java basada en la forma recomendada de Sqlite para hacer esto:
private void dropColumn(SQLiteDatabase db,
ConnectionSource connectionSource,
String createTableCmd,
String tableName,
String[] colsToRemove) throws java.sql.SQLException
List updatedTableColumns = getTableColumns(tableName);
// Remove the columns we don't want anymore from the table's list of columns
updatedTableColumns.removeAll(Arrays.asList(colsToRemove));
String columnsSeperated = TextUtils.join(",", updatedTableColumns);
db.execSQL("ALTER TABLE " + tableName + " RENAME TO " + tableName + "_old;");
// Creating the table on its new format (no redundant columns)
db.execSQL(createTableCmd);
// Populating the table with the data
db.execSQL("INSERT INTO " + tableName + "(" + columnsSeperated + ") SELECT "
+ columnsSeperated + " FROM " + tableName + "_old;");
db.execSQL("DROP TABLE " + tableName + "_old;");
Para obtener la columna de la tabla, utilicé “PRAGMA table_info”:
public List getTableColumns(String tableName)
ArrayList columns = new ArrayList();
String cmd = "pragma table_info(" + tableName + ");";
Cursor cur = getDB().rawQuery(cmd, null);
while (cur.moveToNext())
columns.add(cur.getString(cur.getColumnIndex("name")));
cur.close();
return columns;
De hecho, escribí sobre esto en mi blog, puedes ver más explicaciones allí:
http://udinic.wordpress.com/2012/05/09/sqlite-drop-column-support/
Como otros han señalado
No es posible cambiar el nombre de una columna, eliminar una columna o agregar o eliminar restricciones de una tabla.
fuente: http://www.sqlite.org/lang_altertable.html
Si bien siempre puede crear una nueva tabla y luego eliminar la anterior. Intentaré explicar esta solución con un ejemplo.
sqlite> .schema
CREATE TABLE person(
id INTEGER PRIMARY KEY,
first_name TEXT,
last_name TEXT,
age INTEGER,
height INTEGER
);
sqlite> select * from person ;
id first_name last_name age height
---------- ---------- ---------- ---------- ----------
0 john doe 20 170
1 foo bar 25 171
Ahora quieres eliminar la columna. height
de esta mesa.
Crea otra tabla llamada new_person
sqlite> CREATE TABLE new_person(
...> id INTEGER PRIMARY KEY,
...> first_name TEXT,
...> last_name TEXT,
...> age INTEGER
...> ) ;
sqlite>
Ahora copie los datos de la tabla anterior
sqlite> INSERT INTO new_person
...> SELECT id, first_name, last_name, age FROM person ;
sqlite> select * from new_person ;
id first_name last_name age
---------- ---------- ---------- ----------
0 john doe 20
1 foo bar 25
sqlite>
Ahora suelta el person
tabla y renombrar new_person
para person
sqlite> DROP TABLE IF EXISTS person ;
sqlite> ALTER TABLE new_person RENAME TO person ;
sqlite>
Así que ahora si haces un .schema
ya verás
sqlite>.schema
CREATE TABLE "person"(
id INTEGER PRIMARY KEY,
first_name TEXT,
last_name TEXT,
age INTEGER
);