Bienvenidos sean a este post, hoy continuaremos con lo iniciado en el post anterior es decir las bases de datos y nos centraremos en ver a nuestro primer ejemplo y para ello volveremos a usar a Asteroides, para nuestra modificacion debemos crear una nueva clase de Java llamada AlmacenPuntuacionesSQLite y reemplazaremos el codigo generado por el siguiente:

package com.tinchicus.asteroides;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.util.Vector;

public class AlmacenPuntuacionesSQLite extends SQLiteOpenHelper
        implements AlmacenPuntuaciones {

    public AlmacenPuntuacionesSQLite(Context contexto){
        super(contexto,"puntuaciones",null,1);
    }

    @Override
    public void onCreate(SQLiteDatabase db){
        db.execSQL("CREATE TABLE puntuaciones ("
                +"_id INTEGER PRIMARY KEY AUTOINCREMENT,"
                +" puntos INTEGER, nombre TEXT, fecha LONG)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion,
                          int newVersion){

    }

    public void guardarPuntuacion(int puntos, String nombre,
                                  long fecha){
        SQLiteDatabase db = getWritableDatabase();
        db.execSQL("INSERT INTO puntuaciones VALUES ( null, "
                + puntos + ", '" + nombre + "', " + fecha + " )");
        db.close();
    }

    public Vector<String> listaPuntuaciones(int cantidad){
        Vector<String> resultado = new Vector<String>();
        SQLiteDatabase db = getReadableDatabase();
        Cursor cursor = db.rawQuery("SELECT puntos, nombre FROM "
                +"puntuaciones ORDER BY puntos DESC LIMIT " + cantidad, null);
        while(cursor.moveToNext()){
            resultado.add(cursor.getInt(0) + " " + cursor.getString(1));
        }
        cursor.close();
        db.close();
        return resultado;
    }
}

En esta clase veremos varias cosas, primero extenderemos a la clase SQLiteOpenHelper y luego implementaremos la interfaz AlmacenPuntuaciones, despues definiremos un constructor donde en super enviaremos los siguientes datos:

  • contexto, va a ser el contexto informado en nuestro constructor
  • nombre, este sera el nombre de la base de datos que usaremos y para nuestro caso sera puntuaciones
  • cursor, aca enviaremos el nombre de nuestro cursor pero como se ve en el ejemplo no lo necesitaremos y lo dejaremos como null
  • version, por ultimo sera la version informada para nuestra base de datos

Despues sobreescribiremos nuestro primer metodo, onCreate(), para poder implementar a SQLiteOpenHelper, en este metodo crearemos una tabla en caso de no existir llamada puntuaciones y los campos para esta tabla: _id, puntos, nombre y fecha, en caso de existir omitira este paso, nuestro siguiente metodo sera onUpgrade(), que para nuestro caso no implementamos nada pero en caso de necesitar actualizar la version de nuestra base de datos deberemos hacer las modificaciones pertinentes, con todo esto ya podemos implementar nuestra clase SQLiteOpenHelper ahora debemos agregar los metodos faltantes para poder usar nuestra interfaz AlmacenPuntuaciones.

Para ello primero crearemos el metodo guardarPuntuacion() donde como siempre recibira tres datos (nombre, puntos y fecha), luego crearemos un objeto llamado db del tipo SQLiteDatabase y le asignaremos el metodo getWritableDatabase() y luego por medio de execSQL instanciado del objeto db ejecutamos un query para ingresar los tres datos informados en nuestra tabla puntuaciones, como pueden ver es muy simple:

  1. El primer valor es null porque nuestra tabla autoincrementa _id cuando no se envia ningun valor
  2. Luego enviamos el valor informado en puntos
  3. Despues el valor informado en nombre
  4. Por ultimo el valor informado en fecha

Nuestro siguiente metodo sera listaPuntuaciones() donde enviaremos un atributo que indicara la cantidad, despues crearemos un objeto de tipo Vector llamado resultado, para luego volver a crear un objeto llamado db que nos conectara con la base de datos y le implemetaremos el metodo getReadableDatabase() lo cual nos permitira leer las tablas, despues crearemos un objeto llamado cursor de tipo Cursor y en ella implementaremos un query para hacer una busqueda en la tabla puntuaciones, despues usaremos un bucle while donde usaremos a moveToNext() para pasar de un resultado a otro y agregarlos dentro de nuestro objeto resultado los valores de los campos puntos y nombre , una vez terminado nuestro ciclo procederemos a cerrar a nuestro cursor y luego a nuestro objeto db, con esto tendriamos implementada la clase, para poder probarlo debemos hacer una modificacion mas en MainActivity donde modificaremos la siguiente linea:

almacen = new AlmacenPuntuacionesXML_DOM(this);

Por esta otra:

almacen = new AlmacenPuntuacionesSQLite(this);

Con esta modificacion podremos probar nuestra app, si lo hacemos y clickeamos sobre la opcion puntuaciones obtendremos la siguiente situacion

Si jugamos un poco y agregamos algunos resultados obtendremos la siguiente pantalla

Como pueden ver ahora no solamente agregamos nuevos valores a nuestra base de datos sino tambien logramos implementar la capacidad de ordenarlos no por el ingreso de los puntos sino por el de mayor a menor cantidad de puntos, esto es gracias al query de busqueda en la base especialmente en la seccion de: ORDER BY puntos DESC.

En resumen, hoy hemos visto nuestra primera implementacion de bases de datos, hemos visto como se implementa la clase SQLiteOpenHelper, hemos visto como sobreescribir los metodos necesarios para su implementacion, tambien hemos observado como se implemento correctamente la creacion de la base de datos, como se pudieron ingresar datos a la misma y como obtener los mismos, 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.

Anuncios