Bienvenidos sean a este post, hasta ahora siempre que implementamos SQLiteOpenHelper modificabamos al metodo onCreate() pero solamente declarabamos y no le definiamos ninguna instruccion para el metodo onUpdate(), en el post de hoy veremos para que se utiliza este metodo, su sintaxis es la siguiente:
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
Como pueden ver primero tendremos la base a actualizar, luego una variable de tipo entera donde ira la version vieja y la ultima con la version nueva, gracias a estos datos podremos actualizar la version de nuestras aplicacion sin necesidad de molestar al usuario. Cuando se efectua una actualizacion de una aplicacion esta puede modificar la estructura de datos y nosotros necesitamos modificarla pero sin ocasionar la perdida de la informacion del usuario. Para trabajar sobre esto vamos a trabajar con Asteroides nuevamente, para ello les recomiendo abrir primero el emulador y por medio de Device File Explorer borremos todos los archivos dentro del directorio databases como hicimos en el post anterior, una vez borrado modificaremos la siguiente linea de la clase MainActivity:
almacen = new AlmacenPuntuacionesSQLiteRel(this);
De esta forma:
almacen = new AlmacenPuntuacionesSQLite(this);
Con esta modificacion realizada deberiamos probar nuevamente a Asteroides, jugar y generar un puntaje para que se generen nuevamente los archivos. si probamos puntuaciones antes de jugar no deberia tener ninguna puntuacion, en mi caso jugue dos veces y obtuve las siguientes puntuaciones

Con esto realizado deberiamos volver a Asteroides, en este caso iremos a la clase AlmacenPuntuacionesSQLiteRel para modificar el metodo onUpgrade() con el siguiente codigo:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
if (oldVersion == 1 && newVersion == 2){
onCreate(db);
Cursor cursor = db.rawQuery("SELECT puntos, nombre, fecha"
+ " FROM puntuaciones",null);
while(cursor.moveToNext()){
guardarPuntuacion(db,cursor.getInt(0),
cursor.getString(1),cursor.getLong(2));
}
cursor.close();
db.execSQL("DROP TABLE puntuaciones");
}
}
Primero crearemos un condicional donde verificaremos si oldVersion es igual a uno y newVersion es igual a dos si se cumple la condicion ejecutara el bloque de instrucciones, en este caso la primer linea, onCreate(db), se encargara de crear nuestras nuevas tablas en la base, luego crearemos un cursor para poder conectarnos a la base y ejecutar el query de busqueda en la tabla de puntuaciones, despues habra un while que chequeara que cursor tenga informacion y en caso de ser verdadero procedera a cargar dicha informacion en las nuevas tablas, una vez finalizado cerramos el cursor y eliminamos la tabla puntuaciones por medio de DROP TABLE, con todo esto antes de probar nuevamente nuestra app debemos modificar a la linea almacen en MainActivity como estaba antes:
almacen = new AlmacenPuntuacionesSQLiteRel(this);
Con esta modificacion llamaremos a la clase donde realizamos el ultimo cambio, con esto hecho ahora si podemos probar nuevamente nuestra app como se ve en el siguiente video
Como se observa en el video, nuestro score se migro exitosamente sin necesidad de solicitar al usuario una intervencion.
En resumen, hoy hemos visto como trabaja onUpgrade(), como se puede sacar provecho, como implementarlo correctamente, hemos trabajado con la creacion de las tablas, obtener la informacion, pasarla a las nuevas tablas por medio de guardarPuntuacion y una vez terminada nuestra labor eliminamos la tabla innecesaria, espero les haya sido util sigueme en Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Tambien podes donar
Es para mantenimiento del sitio, gracias!
$1.50