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
- Excepción "tabla ... no tiene columna nombrada ..."
- Android - cómo utilizar "select last_insert_rowid ();"
- SQLITE - configuración de la versión de una nueva base de datos
- nativescript-sqlite y módulo angular2 no se encuentra excepción
- Obtener información de la base de datos sqlite
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?
- ListView no se actualiza al agregar a SQLiteDatabase
- java.lang.IllegalStateException: getWritableDatabase llamado recursivamente
- Tablas de muestra Android sqlite
- DB SQLite de Android Cuando cerrar
- Seleccione sólo los descendientes directos de la tabla con una ruta materializada
- Android SQLite Error "solicitando nombre de columna con nombre de tabla"
- Visualización de la imagen desde la base de datos sqlite con el cursor en android
- Android Sqlite SQLiteDiskIOException: error de E / S de disco (código 1290) SQLITE_IOERR_DIR_FSYNC
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; } }
- ¿Cómo insertar un registro SQLite con una fecha y hora establecida en 'ahora' en la aplicación de Android?
- Esqueleto de aplicación para admitir múltiples pantallas