2011-12-24 30 views
7

Tengo una base de datos a la que deseo agregar una columna, cambié la versión de la base de datos estática pero cuando ejecuto el programa en mi dispositivo la nueva columna todavía no está allí, así que supongo que mi onUpdate no se llama y yo soy no estoy seguro de por qué.¿Está actualizando las versiones de la base de datos sqlite?

Éste es cómo crear la base de datos

 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);"); 
     } 
    } 

¿hay algo más que tengo que hacer para obtener el onUpdate a ser llamado? Probé siguiente this answer pero todavía no hay resultado

Respuesta

11

Con el fin de actualizar la base de datos en Android hay que incrementar la Database_Version por uno, para que SQLOpenHelper sepa que debe llamar al método de actualización.

Rembember

Funciona solo cuando se llama getWritableDatabase() de lo contrario no actualizar. Y si cambia la versión y llama a getReadableDatabase, mostrará una excepción

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

Pero ¿Por qué? Usted ve cuando se llama getWritableDatabase la comprobación de código de carnero la versión es la misma:

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

actualización

Pues resulta que debe trabajar con getReadableDatabase() ya que en el código que siempre está recibiendo una WrittableDatabase también. Por lo tanto, debería funcionar con ambos métodos, aquí está la documentación de getReadableDatabase():

Cree y/o abra una base de datos. Este será el mismo objeto devuelto por getWritableDatabase() a menos que algún problema, como un disco completo, requiera que la base de datos se abra como de solo lectura. En ese caso, se devolverá un objeto de base de datos de solo lectura . Si se resuelve el problema, una llamada futura a getWritableDatabase() puede tener éxito, en cuyo caso el objeto de base de datos de solo lectura se cerrará y el objeto de lectura/escritura se devolverá en el futuro.

+0

entonces, ¿dónde llamo getWritableDatabase? ¿Debería llamarlo en mi constructor? – tyczj

+0

donde sea que vaya a usarlo ... En general, lo uso en mi ContentProvider, pero si no tiene uno, debería funcionar con fluidez en su código, en cualquier lugar donde vaya a insertar o actualizar un getWritableDatabase tiene que ser llamado, no es necesario forzar su uso. – Necronet

+0

@tyczj ~ "¿dónde llamo getWritableDatabase entonces?" Supongo que está utilizando la clase SQLiteOpenHelper para realizar operaciones CRUD. En ese caso, llamaría a getWritableDatabase() cuando obtenga una instancia de SQLiteOpenHelper en su código. –

1

le sugiero que incrementas DATABASE_VERSION por uno, que dará lugar a la aplicación de llamar ONUPGRADE()

+0

me dijo que lo hice y no hicieron nada Editar * He cambiado privada 'static final int Database_Version = 2' de '' 1' a 2' – tyczj

+0

¿hay excepciones en el LogCat? – prometheuspk

Cuestiones relacionadas