2010-04-10 13 views
11

Ho un'applicazione flex/air su cui sto lavorando, utilizza un database SQLite locale che viene creato all'avvio iniziale dell'applicazione.AGGIUNGI COLONNA a sqlite db SE NON ESISTE - flex/air sqlite?

Ho aggiunto alcune funzionalità all'applicazione e nel processo ho dovuto aggiungere un nuovo campo a una delle tabelle del database. Le mie domande sono come ottenere l'applicazione per creare un nuovo campo che si trova in una tabella che esiste già?

questa è una linea che crea la tabella

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

E ora mi piacerebbe aggiungere un campo status_default.

grazie!

Grazie - MPelletier

ho aggiungere il codice che hai fornito e lo fa aggiungere il campo, ma ora la prossima volta ho riavviato la mia app ottengo un errore - 'status_default' esiste già.

Quindi, come posso aggiungere una sorta di istruzione IF NOT EXISTS alla linea che hai fornito?

+0

Qualsiasi motivo per cui non è stata verificata la sintassi SQLite SQL in http://www.sqlite.org? La sintassi del comando ALTER TABLE per aggiungere una nuova colonna non ha alcun tipo di modificatori IF NOT EXISTS, il che significa che dovrai solo gestire l'eccezione/errore nel tuo codice. –

+0

Adam, ho aggiornato la mia risposta. Vedi sotto. – MPelletier

risposta

31
ALTER TABLE tbl_status ADD COLUMN status_default TEXT; 

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

Detto, aggiungendo colonne SQLite è limitata. Non è possibile aggiungere una colonna ovunque ma dopo l'ultima colonna nella tabella.

Come per verificare se la colonna esiste già, PRAGMA table_info(tbl_status); restituirà una tabella che elenca le varie colonne della tabella.

ADD ON:

ho usato una strategia di progettazione di database che mi permette di distinguere quali sono richieste modifiche. Per questo, è necessario un nuovo tavolo (chiamarlo DBInfo), con un campo (Intero, chiamarlo SchemaVersion). In alternativa, esiste anche un valore interno in SQLite chiamato user_version, che può essere impostato con un comando PRAGMA. Il codice può, all'avvio del programma, verificare il numero di versione dello schema e applicare le modifiche di conseguenza, una versione alla volta.

Supponiamo una funzione denominata UpdateDBSchema(). Questa funzione controllerà la versione dello schema del database, manterrà DBInfo non presente e determinerà che il database sia nella versione 0. Il resto di questa funzione potrebbe essere solo un grande switch con diverse versioni, annidato in un ciclo (o altra struttura disponibile alla tua piattaforma di scelta).

Così, per questa prima versione, hanno una funzione di UpgradeDBVersion0To1(), che creerà questa nuova tabella (DBInfo), aggiungere il campo status_default, e impostare SchemaVersion a 1. Nel codice, aggiungere una costante che indica l'ultima versione dello schema, dì LATEST_DB_VERSION e impostalo su 1. In questo modo, il tuo codice e il tuo database hanno una versione dello schema e sai che devi sincronizzarli se non sono uguali.

Quando è necessario apportare un'altra modifica allo schema, impostare la costante LATEST_DB_VERSION su 2 e creare una nuova funzione UpgradeDBVersion1To2() che eseguirà le modifiche richieste.

In questo modo, è possibile eseguire facilmente il porting del programma, connettersi e aggiornare un vecchio database, ecc.

+0

L'utente può impostarlo e modificarlo in qualsiasi momento in modo che non possa dargli un valore impostato. – Adam

+0

Grazie ancora MPelletier che mi ha davvero aiutato! – Adam

+0

Ecco come viene implementato RoundhousE. https://github.com/chucknorris/roundhouse/wiki – Clay

0

ho risolto un problema simile con la risposta da questa domanda: ALTER TABLE ADD COLUMN IF NOT EXISTS in SQLite

utilizzare costruito nel parametro user_version per tenere traccia degli aggiornamenti. Si imposta utilizzando:

PRAGMA user_version = 1 

e si recupera utilizzando

PRAGMA user_version 

Quindi, in pratica recuperare user_version (è 0 per default), controllare se si tratta di 0. Se sì, eseguire gli aggiornamenti e impostarlo su 1. Se si dispone di ulteriori aggiornamenti in futuro, controllare se è 1, eseguire gli aggiornamenti e impostarlo a 0. e così via ...

2

so che questa è una vecchia questione ... tuttavia.

Ho colpito questo problema preciso nella realizzazione SQLite in Adobe AIR. Ho pensato che sarebbe stato possibile utilizzare il comando PRAGMA per risolvere, ma poiché l'implementazione di adobe air non supporta il comando PRAGMA, abbiamo bisogno di un'alternativa.

Quello che ho fatto, che ho pensato che sarebbe la pena, mentre la condivisione qui, è questa:

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(); 

Speranza che aiuta qualcuno.

+0

Utile nel caso in cui il pragma non è disponibile, ma la soluzione da MPelletier è quello che ogni sviluppatore dovrebbe fare per gestire il controllo delle versioni del database e gli aggiornamenti –

+0

PRAGMA non è disponibile nel piano d'azione del PO, quindi pubblicandolo come la soluzione corretta per questo particolare scenario. – stevesweets

0

In alcuni casi ho eseguire il comando e ottenere l'eccezione per "colonna duplicato". Solo una soluzione rapida, non il perfetto.

Problemi correlati