Ya creé tablas sqlite para mi aplicación, pero ahora quiero agregar una nueva tabla a la base de datos.
Cambié la versión de la base de datos de la siguiente manera
private static final int DATABASE_VERSION = 2;
y cadena agregada para crear la tabla
private static final String DATABASE_CREATE_color =
"CREATE TABLE IF NOT EXISTS files(color text, incident_id text)";
onCreate
y onUpgrade
como a 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 no se está creando la nueva tabla. ¿Qué estoy haciendo mal?
Respuestas:
1. Acerca de onCreate () y onUpgrade ()
onCreate(..)
se llama cada vez que la aplicación está recién instalada.onUpgrade
se llama siempre que la aplicación se actualiza y se inicia y la versión de la base de datos no es la misma.2. Incrementar la versión db
Necesitas un constructor como:
IMPORTANTE: ¡Incrementar la versión de la aplicación por sí solo no es suficiente para
onUpgrade
ser llamado!3. ¡No olvide a sus nuevos usuarios!
No olvide agregar
a su método onCreate () también o las aplicaciones recién instaladas carecerán de la tabla.
4. Cómo lidiar con múltiples cambios en la base de datos a lo largo del tiempo
Cuando tenga actualizaciones sucesivas de la aplicación, varias de las cuales tienen actualizaciones de base de datos, debe asegurarse de verificar
oldVersion
:De esta forma, 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, solo recibe 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 lance 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
desinstala totalmente la aplicación. Cuando lo instales de nuevo, tienes la garantía de acertar, lo
onCreate
que evita que tengas que seguir incrementando la versión de la base de datos en la estratosfera a medida que desarrollas ...fuente
oldVersion
argumento pasado? Si alguna declaración de actualización es repetible, es posible que termine repitiéndola en una base de datos en su mayoría actualizada. Si una de las declaraciones es truncar una tabla, sería muy malo.newVersion
es un poco inútil, ya que siempre establece la versión actual de la base de datos de todos modos en el constructor (consulte la parte 2) y siempre coincidirá. La idea clave aquí es que no desea actualizar desde cualquier lugar al que se encuentre el usuarionewVersion
sin pasar por cualquier otra actualización incremental en el medio.CREATE_READINGS
lógica nunca debería estar en onUpgrade, ya que estaba en elonCreate
método de su primera versión. Piense en los casos en elonUpgrade
conmutador como "Estoy actualizando DESDEoldVersion
". No crearía la tabla de lecturas si estuviera actualizando desde la versión 1, ya que ya debería existir. Con suerte, esto tiene sentido ...Tu código parece correcto. Mi sugerencia es que la base de datos ya cree que está actualizada. Si ejecutó el proyecto después de incrementar el número de versión, pero antes de agregar la
execSQL
llamada, es posible que la base de datos de su dispositivo de prueba / emulador ya crea 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, sabrá que fue solo porque su dispositivo creía que ya estaba actualizado.
fuente
onCreate()
como señaló jkschneider.Puede utilizar el
onUpgrade
método de SQLiteOpenHelper . En el método onUpgrade, obtiene oldVersion como uno de los parámetros.En el
onUpgrade
uso ayswitch
en cada uno de loscase
s use el número de versión para realizar un seguimiento de la versión actual de la base de datos.Es mejor que pase de
oldVersion
anewVersion
, incrementándoseversion
en 1 a la vez y luego actualice 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 mucho tiempo, 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.Luego, las actualizaciones en 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 y evitando así que su aplicación falle.
Por ejemplo:
fuente
La respuesta de @jkschneider es correcta. Sin embargo, existe un mejor enfoque.
Escriba los cambios necesarios en un archivo sql para cada actualización como se describe en el enlace https://riggaroo.co.za/android-sqlite-database-use-onupgrade-correctly/
from_1_to_2.sql
from_2_to_3.sql
from_3_to_4.sql
Estos archivos .sql se ejecutarán en el método onUpgrade () de acuerdo con la versión de la base de datos.
DatabaseHelper.java
También se proporciona un proyecto de ejemplo en el mismo enlace: https://github.com/riggaroo/AndroidDatabaseUpgrades
fuente
El manejo de las versiones de la base de datos es una parte muy importante del desarrollo de aplicaciones. Supongo que ya tienes la clase AppDbHelper extendiéndose
SQLiteOpenHelper
. Cuando se amplía que tendrá que poner en prácticaonCreate
yonUpgrade
método.Cuándo
onCreate
yonUpgrade
métodos llamadosonCreate
llamado cuando la aplicación se instaló recientemente.onUpgrade
llamado cuando la aplicación se actualizó.Organización de las versiones de la base de datos Administro las versiones en una clase de métodos. Crear implementación de migración de interfaz. Por ejemplo, para la primera versión, crear la
MigrationV1
clase, la segunda versión, crearMigrationV1ToV2
(estas son mi convención de nomenclatura)Ejemplo de migración:
onCreate
: DadoonCreate
que se llamará cuando la aplicación esté recién instalada, también necesitamos ejecutar todas las migraciones (actualizaciones de la versión de la base de datos). Así seonCreate
verá así:onUpgrade
: Este método se llamará cuando la aplicación ya esté instalada y se actualice a la nueva versión de la aplicación. Si la aplicación contiene cambios en la base de datos, coloque todos los cambios en la nueva clase de migración e incremente la versión de la base de datos.Por ejemplo, digamos que el usuario ha instalado una aplicación que tiene la versión de base de datos 1, y ahora la versión de la base de datos se actualiza a 2 (todas las actualizaciones de esquema se mantienen
MigrationV1ToV2
). Ahora, cuando la aplicación se actualizó, necesitamos actualizar la base de datos aplicando cambios en el esquema de la base de datos deMigrationV1ToV2
esta manera:fuente