Actualizar bases de datos SQLite en Android


Ya vimos hace un tiempo como manejar una base de datos desde nuestro dispositivo móvil con el motor de base de datos SQLite que viene con Android. Una de las cosas que nos puede llegar a suceder con el tiempo es que a nuestra base de datos le tengamos que añadir más campos o hacer algún update en alguna tabla.

Normalmente intentamos dejar el modelo de la base de datos bien definido para no tener que hacer cambios en la base de datos. Pero en el caso de que tengamos que hacer modificaciones en nuestra aplicación una vez está publicada esto puede llegar a complicarse, pero no mucho.

Vamos a retomar el código que escribimos en su día sobre como guardar datos en una base de datos. En ese código definimos una variable llamada versión. Esta versión va a ser la versión de la base de datos. Al introducir nuevos cambios debemos cambiar su valor de 1 a 2, y si más adelante quisieramos hacer más cambios debemos cambiar a 3 y así todas las veces que hagamos un update.

El siguiente paso que tenemos que hacer es definir en una variable que llamaremos SQLUpdateV2 todas las consultas que necesitamos. En este caso como tenemos una tabla de libros vamos a añadirles una columna tipo int que llamaremos precio.


private String SQLUpdateV2 = "ALTER TABLE libros ADD COLUMN precio INT;


Una vez hemos definido esta consulta vamos a utilizar, para ello necesitamos sobreescribir el método onUpdate de la clase SQLiteOpenHelper de la que hereda la clase que estamos utilizando. Este método nos va dar dos parámetros esenciales, la versión anterior y la versión actual. Comparando estos dos parámetros debemos saber cuando ejecutar nuestra consulta de actualización. Veamos como:


@Override
public void onUpgrade(SQLiteDatabase db, int versionAnterior, int versionNueva) {
if(versionAnterior == 1 && versionNueva == 2){
db.execSQL(SQLUpdateV2);
}
}


Cuando solo tenemos dos versiones la cosa es más fácil. Simplemente comprobamos que la versión anterior es 1 y la nueva es 2. En ese caso ejecutamos nuestra actualización y listo.

Tened en cuenta que esto que se está ejecutando no nos tenemos que preocupar de ejecutarlo por nuestra cuenta ya que al heredar de la clase SQLiteOpenHelper, cuando creamos un objeto de nuestra clase se ejecutará automáticamente.

Vamos a complicar un poco más la cosa. Ya hemos realizado los cambios, subido la aplicación al market y hay gente que ya se la descargó y otra que no. Por lo tanto, hay gente con la versión 1 y gente con la versión 2. Y nos damos cuenta que tendríamos que haber dado un valor por defecto de 20 a los libros. Vamos otra vez a crear nuestra consulta de actualización. Pero esta vez le llamamos SQLUpdateV3.


private String SQLUpdateV3 = "UPDATE libros SET precio = 20;"


Y el método onUpdate debemos modificarlo de la siguiente forma. No os olvidéis de cambiar el parámetro versión a 3.


@Override
public void onUpgrade(SQLiteDatabase db, int versionAnterior, int versionNueva) {
if(versionAnterior == 1 && versionNueva >= 2){
db.execSQL(SQLUpdateV2);
}
if(versionAnterior >= 1 && versionNueva >= 3){
db.execSQL(SQLUpdateV3);
}



En este caso hemos cambiado un poco la condición para la actualización de la versión 2, serán aquellas cuya versión antigua sea la 1 y la nueva de la 2 en adelante, porque el usuario puede tener la 2 o la 3. Y para la actualización a la versión 3 serán aquellos que tengan la versión anterior 1 en adelante y la nueva debe ser la 3 en adelante.

Debemos hacerlo así por lo que os decía, una vez publicada en el market la app, perdemos el control de la versión de la base de datos que tiene la gente, puede haber gente que pase por todas las versiones de la base de datos y otras que salte de la 1 a la 3 sin pasar por la 2. Una vez que tenemos esto claro es muy fácil hacer actualizaciones en la base de datos de nuestra app.

Comments are closed.