2011-12-24 16 views
7

Ho un database a cui voglio aggiungere una colonna, ho cambiato la versione del database statico ma quando eseguo il programma sul mio dispositivo la nuova colonna non è ancora lì quindi suppongo che il mio onUpdate non venga chiamato e io sia non so perché.Aggiornamento delle versioni del database SQLite?

Ecco come ho creare il database

 private static class DatabaseHelper extends SQLiteOpenHelper 
    { 
     DatabaseHelper(Context context) 
     { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) 
     { 
      createTables(db); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, 
           int newVersion) 
     { 
      Log.w("CalendarDB", "Upgrading database from version " + oldVersion 
        + " to " 
        + newVersion + ", which will destroy all old data"); 
      db.execSQL("DROP TABLE IF EXISTS Events_Table"); 
      onCreate(db); 
     } 

     private void createTables(SQLiteDatabase db){ 
      db.execSQL("CREATE TABLE " + EVENTS_TABLE + "(" + ID + " integer primary key autoincrement, " + 
        EVENT + " TEXT, " + LOCATION + " TEXT, " + DESCRIPTION + " TEXT, " + DATE + " TEXT, " + START + " LONG, " + END + " TEXT, " + REAL_START_TIME + " TEXT," 
        + REAL_END_TIME + " TEXT," + COLOR + " TEXT, " + BLINK + " TEXT, " + VIBRATE + " TEXT, " + RING_TONE_PATH + " TEXT, " + ICON + " TEXT, " + REMINDERS + 
        " TEXT, " + START_WITH_REMINDER + " TEXT, " + CALENDAR_ID + " TEXT, " + EVENT_ID + " TEXT);"); 
     } 
    } 

C'è qualcos'altro che devo fare per ottenere il onUpdate ottenere chiamato? Ho provato a seguito this answer ma ancora nessun risultato

risposta

11

Al fine di aggiornare il database in Android si dovrebbe incrementare il Database_Version per uno, in modo che SQLOpenHelper sappia che deve chiamare il metodo onUpgrade.

Rembember

Questo funzionano solo quando si chiama getWritableDatabase() altrimenti non verrà aggiornato. E se cambi la versione e chiami getReadableDatabase mostrerà un'eccezione

throw new SQLiteException("Can't upgrade read-only database from version " + 
         db.getVersion() + " to " + mNewVersion + ": " + path); 

Ma perché? Si vede quando si chiama getWritableDatabase il codice di controllo montone la versione è la stessa:

if (version != mNewVersion) { 
       db.beginTransaction(); 
       try { 
        if (version == 0) { 
         onCreate(db); 
        } else { 
         if (version > mNewVersion) { 
          onDowngrade(db, version, mNewVersion); 
         } else { 
          onUpgrade(db, version, mNewVersion); 
         } 
        } 
        db.setVersion(mNewVersion); 
        db.setTransactionSuccessful(); 
       } finally { 
        db.endTransaction(); 
} 
} 

Aggiornamento

Ben scopre che dovrebbe funzionare con getReadableDatabase() in quanto il codice che hai sempre trovato anche un WrittableDatabase. Quindi dovrebbe funzionare con entrambi i metodi, ecco la documentazione per getReadableDatabase():

Creare e/o aprire un database. Questo sarà lo stesso oggetto restituito da getWritableDatabase() a meno che qualche problema, come un disco completo, richieda che il database sia aperto in sola lettura. In tal caso, verrà restituito un oggetto di database di sola lettura . Se il problema è risolto, una chiamata futura a getWritableDatabase() potrebbe riuscire, nel qual caso l'oggetto di database di sola lettura verrà chiuso e l'oggetto di lettura/scrittura verrà restituito in futuro.

+0

quindi dove posso chiamare getWritableDatabase? dovrei chiamarlo nel mio costruttore? – tyczj

+0

ovunque tu voglia utilizzarlo ... Io in generale lo uso nel mio ContentProvider ma se non ne hai uno, dovrebbe essere scritto correttamente nel tuo codice, qualsiasi dove tu stia per inserire o aggiornare un getWritableDatabase deve essere chiamato, non è necessario forzare il suo uso. – Necronet

+0

@tyczj ~ "dove posso chiamare getWritableDatabase?" Suppongo che stai usando la classe SQLiteOpenHelper per eseguire operazioni CRUD? In tal caso, chiamerai getWritableDatabase() quando ottieni un'istanza di SQLiteOpenHelper nel tuo codice. –

1

ti suggerisco incrementa DATABASE_VERSION per uno, che porterà all'applicazione di chiamare ONUPGRADE()

+0

ho affermato che ho fatto e fatto fare nulla Edit * Ho cambiato 'private static finale int Database_Version = 2' da' 1' a '2' – tyczj

+0

ci sono delle eccezioni nel LogCat? – prometheuspk

Problemi correlati