2010-04-10 37 views
11

Tengo una aplicación de flex/air en la que he estado trabajando, utiliza una base de datos sqlite local que se crea en el inicio de la aplicación inicial.AGREGAR COLUMNA a sqlite db SI NO EXISTE - flex/air sqlite?

He agregado algunas características a la aplicación y en el proceso tuve que agregar un nuevo campo a una de las tablas de la base de datos. Mi pregunta es cómo hacer para que la aplicación cree un nuevo campo que se encuentra en una tabla que ya existe.

esta es una de la línea que crea la tabla

stmt.text = "CREATE TABLE IF NOT EXISTS tbl_status ("+"status_id INTEGER PRIMARY KEY AUTOINCREMENT,"+" status_status TEXT)"; 

Y ahora me gustaría añadir un campo status_default.

gracias!

Gracias - MPelletier

He añadir el código que ya ha proporcionado y se le añade el campo, pero ahora la próxima vez que reinicio mi aplicación me sale un error - 'status_default' ya existe.

Entonces, ¿cómo puedo agregar algo de una declaración IF NOT EXISTS a la línea que proporcionó?

+0

¿Alguna razón por la que no ha comprobado la sintaxis de SQLite SQL en http://www.sqlite.org? La sintaxis del comando ALTER TABLE para agregar una nueva columna no tiene ningún tipo de modificadores IF NOT EXISTS, lo que significa que tendrá que manejar la excepción/error en su propio código. –

+0

Adam, he actualizado mi respuesta. Por favor ver más abajo. – MPelletier

Respuesta

31
ALTER TABLE tbl_status ADD COLUMN status_default TEXT; 

http://www.sqlite.org/lang_altertable.html

Dicho esto, la adición de columnas en SQLite es limitado. No puede agregar una columna en cualquier lugar, pero después de la última columna de su tabla.

En cuanto a comprobar si la columna ya existe, PRAGMA table_info(tbl_status); devolverá una tabla que enumera las diversas columnas de su tabla.

Add On:

He estado usando una estrategia en el diseño de la base de datos que me permite distinguir qué modificaciones son necesarias. Para esto, necesitará una nueva tabla (llámelo DBInfo), con un campo (Entero, llámelo SchemaVersion). Alternativamente, también hay un valor interno en SQLite llamado user_version, que se puede establecer con un comando PRAGMA. Su código puede, al inicio del programa, verificar el número de versión del esquema y aplicar los cambios en consecuencia, una versión a la vez.

Suponga una función llamada UpdateDBSchema(). Esta función comprobará su versión de esquema de base de datos, manejará DBInfo que no está allí y determinará que la base de datos está en la versión 0. El resto de esta función podría ser simplemente un interruptor grande con diferentes versiones, anidadas en un bucle (u otra estructura disponible) a su plataforma de elección).

Así que para esta primera versión, tienen una función UpgradeDBVersion0To1(), lo que creará esta nueva tabla (DBInfo), añadir su campo status_default y establezca SchemaVersion a 1. En su código, añadir una constante que indica la última versión de esquema, diga LATEST_DB_VERSION, y establézcalo en 1. De esa manera, su código y su base de datos tienen una versión de esquema, y ​​usted sabe que necesita sincronizarlos si no son iguales.

Cuando necesite hacer otro cambio en su esquema, establezca la constante LATEST_DB_VERSION en 2 y cree una nueva función UpgradeDBVersion1To2() que realizará los cambios necesarios.

De esta manera, su programa se puede portar fácilmente, se puede conectar y actualizar una base de datos antigua, etc.

+0

El usuario puede configurar y cambiar el valor predeterminado en cualquier momento, por lo que no puedo darle un valor establecido. – Adam

+0

¡Gracias de nuevo MPelletier que realmente me ayudó! – Adam

+0

Así es como se implementa RoundhousE. https://github.com/chucknorris/roundhouse/wiki – Clay

0

me resolvió un problema similar con la respuesta de esta pregunta: ¿ ALTER TABLE ADD COLUMN IF NOT EXISTS in SQLite

utilizar construido en el parámetro user_version para realizar un seguimiento de las actualizaciones. Se configura usando:

PRAGMA user_version = 1 

y se recupera usando

PRAGMA user_version 

Así que, básicamente, recuperar user_version (que es 0 por defecto), comprobar si es 0. Si es así, lleve a cabo las actualizaciones y la puso a 1. Si tiene más actualizaciones en el futuro, verifique si es 1, realice actualizaciones y ajústelo a 0. Y así sucesivamente ...

2

Sé que esta es una vieja pregunta ... sin embargo.

He llegado a este problema preciso en la implementación de SQLite en Adobe AIR. Pensé que sería posible usar el comando PRAGMA para resolverlo, pero como la implementación de adobe air no es compatible con el comando PRAGMA, necesitamos una alternativa.

Lo que hice, que pensé que valdría la pena compartir aquí, es la siguiente:

var sql:SQLStatement = new SQLStatement(); 
sql.sqlConnection = pp_db.dbConn; 
sql.text = "SELECT NewField FROM TheTable"; 
sql.addEventListener(SQLEvent.RESULT, function(evt:SQLEvent):void { 
}); 

sql.addEventListener(SQLErrorEvent.ERROR, function(err:SQLErrorEvent):void { 
    var sql:SQLStatement = new SQLStatement(); 
    sql.sqlConnection = pp_db.dbConn; 
    sql.text = "ALTER TABLE TheTable ADD COLUMN NewField NUMERIC;"; 
    sql.execute(); 
    sql.addEventListener(SQLEvent.RESULT, function (evt:SQLEvent):void { 
    }); 
}); 
sql.execute(); 

espero que ayude a alguien.

+0

Útil en caso de que pragma no esté disponible, pero la solución de MPelletier es lo que cualquier desarrollador debe hacer para manejar el control de versiones de la base de datos y las actualizaciones –

+0

PRAGMA NO está disponible en el escenario del PO, por lo tanto publicarlo como la solución correcta para este escenario en particular. – stevesweets

0

En algunos casos ejecuto el comando y obtengo la excepción para "columna duplicada". Solo una solución rápida, no perfecta.

Cuestiones relacionadas