2011-11-28 19 views
60

Ho un problema con il database Android SQLite.Come aggiungere una nuova colonna al database SQLite di Android?

Ho una tabella che contiene un campo.StudentFname e quell'applicazione funziona correttamente con Android 2.3.1 e ora se aggiungo un altro campo, la mia applicazione non funziona correttamente.

Qualcuno mi può aiutare chi lo sa base di dati molto bene,

risposta

146

è possibile utilizzare ALTER TABLE la funzione del metodo di onUpgrade(), in questo modo:

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    // If you need to add a column 
    if (newVersion > oldVersion) { 
    db.execSQL("ALTER TABLE foo ADD COLUMN new_column INTEGER DEFAULT 0"); 
    } 
} 

Ovviamente, lo SQLite sarà diverso a seconda della definizione di colonna.

+1

hi! ho provato questo ho usato sul metodo di upgrate e dentro che ho messo query di tabella alter pure. Ma ancora non sono in grado di aggiungere una nuova colonna al database ... ma ya quando scrivo una query per aggiungere una nuova colonna e rinominato il database e il nome della tabella sono entrambi in grado di aggiungere una nuova colonna..ma con l'aiuto del metodo alter table non sono in grado di farlo ... il database e la tabella di ridimensionamento non è l'attività desiderata. Dovrebbe funzionare con alter tabella ... ancora non riesco a farlo con il metodo alter table .. – Aamirkhan

+0

come aumentare il valore come 0,1,2,3, .......... – NagarjunaReddy

+0

@NagarjunaReddy scusa per la risposta in ritardo. è possibile utilizzare questo metodo db.execSQL ("UPDATE table SET key = key + 1 WHERE name =?", New String [] {name}); – DevYudh

19

Il modo più semplice per eseguire questa operazione è aggiungere un metodo SQL to the onUpgrade() nel numero SQLiteOpenHelper class. Qualcosa di simile:

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    // If you need to add a new column 
    if (newVersion > oldVersion) { 
     db.execSQL("ALTER TABLE student ADD COLUMN student_rollno INTEGER DEFAULT 0"); 
    } 
} 
+0

ho provato questo, ma ancora non sono in grado di aggiungere nuova colonna utilizzando il metodo alter tabella in su il metodo di upgrate. – Aamirkhan

+0

ciao! ho provato questo ho usato sul metodo di upgrate e dentro che ho messo query di tabella alter pure. Ma ancora non sono in grado di aggiungere una nuova colonna al database ... ma ya quando scrivo una query per aggiungere una nuova colonna e rinominato il database e il nome della tabella sono entrambi in grado di aggiungere una nuova colonna..ma con l'aiuto del metodo alter table non sono in grado di farlo ... il database e la tabella di ridimensionamento non è l'attività desiderata. Dovrebbe funzionare con alter tabella..non riesco a farlo con alter table metodo – Aamirkhan

+0

come aumentare il valore come Auto incremento 0,1,2,3, .......... – NagarjunaReddy

3

@ Aamirkhan.i pensare che avrebbe risolto il problema lei ha citato nei commenti molto indietro ago.i pensa che non si ha aumentato la versione base di dati. oppure le risposte qui sono semplici. Sto scrivendo questo perché potrebbe aiutare chiunque non abbia aumentato o modificato il proprio numero di versione del database quando sta modificando un tavolo.

+0

sì, cambiando il nome del database e l'applicazione di disinstallazione e reinstallandolo di nuovo risolverebbe il problema – Aamirkhan

+0

@Aamirkhan, spostare l'assegno alla risposta successiva in modo che la soluzione più chiara sia disponibile al pubblico. – AlleyOOP

17

Ho trovato questo thread quando ho bisogno di aiuto sulla mia app, ma ho riscontrato problemi con molte delle risposte. Suggerirei di fare quanto segue:

private static final String DATABASE_ALTER_TEAM_1 = "ALTER TABLE " 
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_COACH + " string;"; 

private static final String DATABASE_ALTER_TEAM_2 = "ALTER TABLE " 
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_STADIUM + " string;"; 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    if (oldVersion < 2) { 
     db.execSQL(DATABASE_ALTER_TEAM_1); 
    } 
    if (oldVersion < 3) { 
     db.execSQL(DATABASE_ALTER_TEAM_2); 
    } 
} 

Si desidera assicurarsi che il codice funziona quando gli utenti l'aggiornamento più di 1 di versione e che la dichiarazione di aggiornamento viene eseguito solo aggiornare quello che è necessario. Per un po 'di più su questo, controlla questo blog.

+0

cosa fare se vogliamo creare una colonna modificata con valore String predefinito ?? –

+3

La migliore soluzione che ho letto e bel blog btw! – MrBrightside

13

Forse un approccio un po 'più elegante con l'interruttore al posto di if/then che l'aggiornamento da qualsiasi schema per il più recente schema di ...

Ecco anche una pagina decente sul sintassi per alterare una tabella: http://alvinalexander.com/android/sqlite-alter-table-syntax-examples

public static final String TABLE_TEAM = "team"; 
public static final String COLUMN_COACH = "coach"; 
public static final String COLUMN_STADIUM = "stadium"; 


private static final String DATABASE_ALTER_TEAM_TO_V2 = "ALTER TABLE " 
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_COACH + " TEXT;"; 

private static final String DATABASE_ALTER_TEAM_TO_V3 = "ALTER TABLE " 
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_STADIUM + " TEXT;"; 


@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    switch (oldVersion) 
    { 
     case 1: 
      //upgrade from version 1 to 2 
      db.execSQL(DATABASE_ALTER_TEAM_TO_V2); 
     case 2: 
      //upgrade from version 2 to 3 
      db.execSQL(DATABASE_ALTER_TEAM_TO_V3); 

     //and so on.. do not add breaks so that switch will 
     //start at oldVersion, and run straight through to the latest 

    } 

} 
+0

Questo è il modo per gestire più aggiornamenti. Verifica da quale versione proviene! – Ricardo

+0

Se si passa direttamente dalla versione 1 alla 3 (se qualcuno non aggiorna automaticamente l'app), non si raggiungerà il caso 2. – TyMarc

+0

@ TyMarc-- Sì, verrà aggiornato alle versioni 2 e 3. Lo switch utilizza la vecchia versione. Quindi, nel tuo esempio, la versione precedente è 1. Il codice eseguirà quindi il caso 1, che aggiorna dalla versione 1 alla 2, e quindi eseguirà il caso 2 (poiché non c'è interruzione;), che aggiorna da 2 a 3. Va tutto bene nella descrizione. –

2

Penso che non dovremmo controllare la condizione del genere

if (newVersion > oldVersion) { 
} 

perché se usiamo questo, significa che ogni volta quando abbiamo incre ase la versione del database poi onUpdrade() verrà chiamata e la condizione sarà vera, quindi dovremmo controllare come quello

if(oldVersion==1) 
{ 

} 

quindi in questo caso, se vecchia versione è 2 allora condizione sarà falsa e l'utente con la vecchia versione 2 sarà non aggiornare il database (quale utente desidera solo per la versione 1), perché per quegli utenti il ​​database era già aggiornato.

0

Ho trovato il collegamento mentre cercavo lo stesso problema. Spiega come usare l'aggiornamento. https://thebhwgroup.com/blog/how-android-sqlite-onupgrade

si spiega perché per utilizzare questo codice sotto

@Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     if (oldVersion < 2) { 
      db.execSQL(DATABASE_ALTER_TEAM_1); 
     } 
     if (oldVersion < 3) { 
      db.execSQL(DATABASE_ALTER_TEAM_2); 
     } 
    } 
0

Il modo più semplice per creare una nuova colonna su un tavolo è aggiungere un po 'SQL al metodo ONUPGRADE() in classe SQLiteOpenHelper. Come:

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    switch (oldVersion) { 
     case 1: 
      db.execSQL(SQL_MY_TABLE); 

     case 2: 
      db.execSQL("ALTER TABLE myTable ADD COLUMN myNewColumn TEXT"); 
    } 
} 
1

Per aggiungere una nuova colonna alla tabella è necessario utilizzare ALTER. In Android è possibile aggiungere la nuova colonna all'interno dello onUpgrade().

Ci si potrebbe chiedere, come onUpgrade() aggiungerà la nuova colonna?

Quando si implementa una sottoclasse di SQLiteOpenHelper, è necessario chiamare il costruttore della superclasse: super(context, DB_NAME, null, 1); nel costruttore della classe. Ci ho passato 1 per la versione.

Quando ho modificato la versione 1 sopra (2 o successiva), viene richiamato onUpgrade(). Ed esegui le modifiche SQL che intendo fare. mio costruttore di classe dopo aver cambiato la versione:

public DatabaseHelper(Context context) { 
    super(context, DB_NAME, null, 2);//version changed from 1 to 2 
} 

SQL modifiche controlli di questo tipo, costruttore della superclasse confronta la versione del file db SQLite memorizzato con la versione che ho passato a super(). Se questi numeri di versione (precedenti e attuali) sono diversi, viene richiamato onUpgrade().

codice dovrebbe essere simile a questo:

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    // add new columns to migrate to version 2 
    if (oldVersion < 2) { 
     db.execSQL("ALTER TABLE " + TABLE_NAME + "ADD COLUMN school VARCHAR(250)"); 
    } 
    // add new columns to migrate to version 3 
    if (oldVersion < 3) { 
     db.execSQL("ALTER TABLE " + TABLE_NAME + "ADD COLUMN age INTEGER"); 
    } 
} 
2

ho fatto il seguente approccio, è resovled per me

se la versione DB: 6

Ex : There is a table with 5 columns 

Quando si aggiornamento a: 7 (Sto aggiungendo 1 nuova colonna nei 3 tavoli)

1. We need to add the columns when creating a table 

2. onUpgrade method: 

if (oldVersion < 7) 
{ 
    db.execSQL(DATABASE_ALTER_ADD_PAPER_PAID); 
    db.execSQL(DATABASE_ALTER_LAST_UPLOADED); 
    db.execSQL(DATABASE_ALTER_PAPER_LABEL); 
} 

Dove: "DATABASE_ALTER_ADD_PAPER_PAID" è una query.

EX: public static final String DATABASE_ALTER_ADD_PAPER_PAID = "ALTER TABLE " 
       + TableConstants.MY_PAPERS_TABLE + " ADD COLUMN " + COLUMN_PAPER_PAID + " TEXT;"; 

Dopo due precedenti operazione sarà funziona bene per la nuova installazione utente e applicazione di aggiornamento utente

Problemi correlati