Android: actualizar la versión de la base de datos y agregar nueva tabla

Ya he creado tablas sqlite para mi aplicación, pero ahora quiero añadir una nueva tabla a la base de datos.

Cambié la versión de DB como abajo

private static final int DATABASE_VERSION = 2; 

Y Añadido string para crear tabla

 private static final String DATABASE_CREATE_color = "CREATE TABLE IF NOT EXISTS files(color text, incident_id text)"; 

onCreate y onUpgrade como se onUpgrade continuación:

 @Override public void onCreate(SQLiteDatabase database) { database.execSQL(DATABASE_CREATE_incident); database.execSQL(DATABASE_CREATE_audio); database.execSQL(DATABASE_CREATE_video); database.execSQL(DATABASE_CREATE_image); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //drop table and add new tables when version 2 released. db.execSQL(DATABASE_CREATE_color); } 

Pero por alguna razón la nueva tabla no está siendo creada. ¿Qué estoy haciendo mal?

1. Acerca de onCreate () y onUpgrade ()

onCreate(..) se llama cuando la aplicación está recién instalada. onUpgrade se llama cuando la aplicación se actualiza y se inicia y la versión de la base de datos no es la misma.

2. Incremento de la versión db

Necesitas un constructor como:

 MyOpenHelper(Context context) { super(context, "dbname", null, 2); // 2 is the database version } 

IMPORTANTE: ¡Incrementar la versión de la aplicación por sí solo no es suficiente para que onUpgrade sea ​​llamado!

3. No se olvide de sus nuevos usuarios!

No te olvides de añadir

 database.execSQL(DATABASE_CREATE_color); 

A su método onCreate () o bien las aplicaciones recién instaladas carecerán de la tabla.

4. Cómo lidiar con múltiples cambios en la base de datos con el tiempo

Cuando tenga sucesivas actualizaciones de aplicaciones, varias de las cuales tienen actualizaciones de base de datos, desea asegurarse de que comprueba oldVersion :

 onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { switch(oldVersion) { case 1: db.execSQL(DATABASE_CREATE_color); // we want both updates, so no break statement here... case 2: db.execSQL(DATABASE_CREATE_someothertable); } } 

De esta manera, cuando un usuario actualiza de la versión 1 a la versión 3, obtiene ambas actualizaciones. Cuando un usuario actualiza de la versión 2 a la 3, sólo obtiene la actualización de la revisión 3 … Después de todo, no puede contar con el 100% de su base de usuarios para actualizar cada vez que publique una actualización. A veces se saltan una actualización o 12 🙂

5. Mantener sus números de revisión bajo control mientras desarrolla

Y finalmente … llamando

 adb uninstall <yourpackagename> 

Desinstala totalmente la aplicación. Al instalar de nuevo, que está garantizado para golpear onCreate que le impide tener que seguir incrementando la versión de la base de datos en la estratosfera a medida que …

Su código parece correcto. Mi sugerencia es que la base de datos ya piensa que ha actualizado. Si ejecutó el proyecto después de incrementar el número de versión, pero antes de agregar la llamada execSQL , la base de datos en su dispositivo de prueba / emulador ya puede creer que está en la versión 2.

Una forma rápida de verificar esto sería cambiar el número de versión a 3 – si se actualiza después de eso, sabes que fue sólo porque tu dispositivo creía que ya estaba actualizado.

Puede utilizar el método onUpgrade de onUpgrade . En el método onUpgrade, obtiene oldVersion como uno de los parámetros.

En el onUpgrade use un switch y en cada case use el número de versión para realizar un seguimiento de la versión actual de la base de datos.

Lo mejor es pasar de oldVersion a newVersion , incrementar la version por 1 a la vez y luego actualizar la base de datos paso a paso. Esto es muy útil cuando alguien con la versión 1 de la base de datos actualiza la aplicación después de un tiempo largo, a una versión que usa la versión 7 de la base de datos y la aplicación comienza a fallar debido a ciertos cambios incompatibles.

A continuación, las actualizaciones de la base de datos se realizarán paso a paso, cubriendo todos los casos posibles, es decir, incorporando los cambios en la base de datos realizados para cada nueva versión e impidiendo así que su aplicación se bloquee.

Por ejemplo:

 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { switch (oldVersion) { case 1: String sql = "ALTER TABLE " + TABLE_SECRET + " ADD COLUMN " + "name_of_column_to_be_added" + " INTEGER"; db.execSQL(sql); break; case 2: String sql = "SOME_QUERY"; db.execSQL(sql); break; } } 
  • Utilización de la base de datos legible y escrita de SQLite
  • ¿Cómo agregar datos iniciales a la base de datos SQLite?
  • Actualizar la base de datos local de Android
  • ¿Cómo obtener contactos en orden de sus próximos cumpleaños?
  • ¿Cuál es la forma más rápida de cargar 10000 filas de la base de datos SQLite?
  • ¿Qué es la base de datos "-journal" SQLite en Android?
  • Selección de un proyecto ORM para Android (nivel mínimo de API 7)
  • Cómo incrustar una fuente personalizada en la aplicación de Android (WebView)
  • Android NullPointerException al ejecutar la consulta en la base de datos SQLite
  • Esquema de la base de datos de Android Sqlite
  • Cursor.moveToNext sin moverToFirst
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.