Bienvenidos sean a este post, hoy seguiremos con las bases de datos de nuestro dispositivo pero en esta oportunidad nos centraremos en la aplicacion Mis Lugares, si no tenes esta app te recomiendo estos posts donde lo creamos y modificamos:

Anuncios

Les recomiendo en caso de no tener la app hacerla con todos los links antes mostrados, si miramos nuestra app veremos que para almacenar nuestros lugares utilizamos una clase llamada lugares y a partir de los siguientes ejemplos iremos migrando los lugares almacenados en esta clase a una base de datos, para ello primero crearemos una nueva clase llamada LugaresBD, una vez creada reemplazaremos nuestro codigo con el siguiente:

package org.example.mislugares;

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

public class LugaresDB extends SQLiteOpenHelper {

    public LugaresDB(Context contexto){
        super(contexto,"lugares",null,1);
    }


    @Override
    public void onCreate(SQLiteDatabase db){
        db.execSQL("CREATE TABLE IF NOT EXISTS lugares ("
                + "_id INTEGER PRIMARY KEY AUTOINCREMENT, "
                + "nombre TEXT, "
                + "direccion TEXT, "
                + "longitud REAL, "
                + "latitud REAL, "
                + "tipo INTEGER, "
                + "foto TEXT, "
                + "telefono INTEGER, "
                + "url TEXT, "
                + "comentario TEXT, "
                + "fecha LONG, "
                + "valoracion REAL)");
        db.execSQL("INSERT INTO lugares VALUES (null,"
                + "'El bunker de Tinchicus',"
                + "'Mercedes Sosa S/N',"
                + "-64.5750594,-32.0728125, "
                + TipoLugar.EDUCACION.ordinal()
                + ",'',1155556666,"
                + "'https://tinchicus.com',"
                + "'Un gran lugar para aprender',"
                + System.currentTimeMillis()
                + ",4.0)");
        db.execSQL("INSERT INTO lugares VALUES (null,"
                + "'El Chañar',"
                + "'Ruta Prov. 228'"
                + ",-64.5763231,-32.0709157,"
                + TipoLugar.RESTAURANTE.ordinal()
                + ",'',515273,"
                + "'https://www.elchanar.com.ar',"
                + "'Un gran lugar para comer',"
                + System.currentTimeMillis()
                + ",3.0)");
        db.execSQL("INSERT INTO lugares VALUES (null,"
                + "'Moea Moeea',"
                + "'Libertad 400',"
                + "-64.5404959,-32.0671108,"
                + TipoLugar.BAR.ordinal()
                + ",'',429992,"
                + "'https://www.moemoeea.com.ar',"
                + "'Un gran lugar para tomar algo',"
                + System.currentTimeMillis()
                + ",3.0)");
        db.execSQL("INSERT INTO lugares VALUES (null,"
                + "'Reserva Cascada Escondida',"
                + "'Camino Rural S/N',"
                + "-64.5168508,-32.0717533,"
                + TipoLugar.NATURALEZA.ordinal()
                + ",'',555666,"
                + "'https://www.starosadecalamuchita.com.ar',"
                + "'Pedazo de paraiso en la tierra',"
                + System.currentTimeMillis()
                + ",4.0)");
    }

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

Esta clase solo extenderemos a la clase SQLiteOpenHelper, en el post anterior analizamos el constructor donde por medio de super setearemos el contexto, el nombre de la base, el cursor y la version, nuestro siguiente paso sera sobreescribir los dos metodos necesarios, el metodo onUpgrade() solamente sera definido en forma vacia para poder implementar la herencia, pero en onCreate() crearemos nuestra tabla (en caso de no existir) por medio de execSQL, nuestro siguiente paso sera agregar los cuatro lugares que teniamos almacenados en la clase Lugares, pasaremos dato por dato, con esta simple accion ya tendremos creada en la base la tabla con los datos necesarios ahora solamente nos resta hacer los metodos necesarios para poder recuperarlos, observen que son cuatro lugares creados por mi en las proximidades de donde vivo pero si se animan traten de implementar los suyos, pasemos a la siguiente modificacion para ello debemos pasar a la clase Lugares.

Nota: Antes de hacer todas estas modificaciones podriamos haber hecho un back up de nuestra app pero no lo informe porque no me parecio necesario ya que en caso de querer volverlo para atras tenemos los otros posts.

Una vez en la clase Lugares agregaremos el siguiente bloque:

    private static LugaresDB LugaresDB;
    
    public static void inicializaDB(Context contexto){
        LugaresDB = new LugaresDB(contexto);
    }
    
    public static Cursor listado(){
        SQLiteDatabase db = LugaresDB.getReadableDatabase();
        return db.rawQuery("SELECT * FROM lugares",null);
    }

Primero crearemos una constante llamada LugaresDB del tipo LugaresDB, nuestra clase anterior, el metodo inicializaDB sirve para iniciar la constante antes creada por medio de LugaresDB y por ultimo tendremos un metodo de tipo Cursor llamado listado() al cual le permitiremos leer la base por medio de getReadableDatabase() y luego llamaremos por medio de rawQuery a un query donde nos traera todos los datos y esto lo devolvera a la salida del mismo, en este caso podriamos haber borrado algunas lineas pero por ahora lo dejaremos para mas adelante dado que no afectan a nuestra funcionalidad, el codigo de Lugares quedo de la siguiente forma:

package org.example.mislugares;

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

import java.util.ArrayList;
import java.util.List;

public class Lugares {
    final static String TAG = "MisLugares";
    protected static GeoPunto posicionActual = new GeoPunto(0,0);

    protected static List<Lugar> vectorLugares = ejemploLugares();

    public Lugares(){
        vectorLugares = ejemploLugares();
    }

    static Lugar elemento(int id){
        return vectorLugares.get(id);
    }

    static void anyade(Lugar lugar){
        vectorLugares.add(lugar);
    }

    static int nuevo(){
        Lugar lugar = new Lugar();
        vectorLugares.add(lugar);
        return vectorLugares.size() - 1;
    }

    static void borrar(int id){
        vectorLugares.remove(id);
    }

    public static int size() {
        return vectorLugares.size();
    }

    public static ArrayList<Lugar> ejemploLugares(){
        ArrayList <Lugar> lugares = new ArrayList <Lugar>();
        lugares.add(new Lugar("El bunker de Tinchicus",
                "Mercedes Sosa S/N",
                -64.5750594,-32.0728125,
                TipoLugar.EDUCACION,
                1155556666,
                "https://tinchicus.com",
                "Un gran lugar para aprender",
                4));
        lugares.add(new Lugar("El Chañar",
                "Ruta Prov. 228",
                -64.5404009,-32.0672181,
                TipoLugar.RESTAURANTE,
                515273,
                "https://www.elchanar.com.ar",
                "Un gran lugar para comer",
                3));
        lugares.add(new Lugar("Moea Moeea",
                "Libertad 400",
                -64.5404959,-32.0671108,
                TipoLugar.BAR,
                429992,
                "https://www.moemoeea.com.ar",
                "Un gran lugar para tomar algo",
                3));
        lugares.add(new Lugar("Reserva Cascada Escondida",
                "Camino Rural S/N",
                -64.5168508,-32.0717533,
                TipoLugar.NATURALEZA,
                555666,
                "https://www.starosadecalamuchita.com.ar",
                "Pedazo de paraiso en la tierra",
                4));
        return lugares;
    }

    private static LugaresDB LugaresDB;

    public static void inicializaDB(Context contexto){
        LugaresDB = new LugaresDB(contexto);
    }

    public static Cursor listado(){
        SQLiteDatabase db = LugaresDB.getReadableDatabase();
        return db.rawQuery("SELECT * FROM lugares",null);
    }
}

Nuestra ultima modificacion sera en MainActivity donde deberemos ir al metodo onCreate() y comentaremos la siguiente linea:

adaptador = new AdaptadorLugares(this);

Y agregaremos el siguiente bloque:

        Lugares.inicializaDB(this);
        adaptador = new SimpleCursorAdapter(this,
                R.layout.elemento_lista,
                Lugares.listado(),
                new String[] { "nombre", "direccion"}, 
                new int[] { R.id.nombre, R.id.direccion},
                0);
Anuncios

En este caso primero inicializamos a Lugares por medio de inicializaDB() y luego utilizaremos el metodo SimpleCursorAdapter() para el objeto adaptador, en este caso pasaremos varios datos, primero el contexto, luego el elemento que sera de salida, despues llamaremos al metodo listado que agregamos en Lugares y por ultimo mostraremos dos Arrays, uno de tipo String y otro de tipo int, en el primero obtendremos los datos del query y en el segundo seran los elementos a donde enviaremos la informacion, nuestro metodo onCreate() quedara de la siguiente forma:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // adaptador = new AdaptadorLugares(this);
        Lugares.inicializaDB(this);
        adaptador = new SimpleCursorAdapter(this,
                R.layout.elemento_lista,
                Lugares.listado(),
                new String[] { "nombre","direccion" },
                new int[] { R.id.nombre, R.id.direccion},
                0);
        ListView listavista = (ListView) findViewById(R.id.ListaVista);
        listavista.setAdapter(adaptador);
        listavista.setOnItemClickListener(this);
        manejador = (LocationManager) getSystemService(
                LOCATION_SERVICE);
        if (manejador.isProviderEnabled(LocationManager.
                GPS_PROVIDER)){
            actualizaMejorLocaliz(manejador.getLastKnownLocation(
                    LocationManager.GPS_PROVIDER));
        }
        if (manejador.isProviderEnabled(LocationManager.
                NETWORK_PROVIDER)){
            actualizaMejorLocaliz(manejador.getLastKnownLocation(
                    LocationManager.NETWORK_PROVIDER));
        }
    }
Nota: puede ocurrir que al armar el adaptador les devuelva un error, para ello les recomiendo utilizar el siguiente paquete:
import android.support.v4.widget.SimpleCursorAdapter;
Si es posible traten de que Android Studio lo modifique por ustedes.

Con todas estas modificaciones podemos probar nuestra app, si la compilamos y ejecutamos obtendremos una pantalla como esta

Como utilizamos un adaptador simple y en este solo trajimos dos datos, nombre y direccion, pero no nos trajo el resto, con esta simple modificacion ya pudimos probar la conexion con la base y como trajimos la informacion almacenada en la base, esta es una forma basica de obtener la informacion pero mas adelante crearemos nuestro adaptador para mejorar la busqueda y otras acciones.

Anuncios

En resumen, hoy hemos hecho la modificacion para almacenar nuestros lugares en la app Mis Lugares, hemos visto la clase necesaria para hacerlo, hemos utilizado un metodo muy simple pero efectivo para obtener algunos datos, espero les sea 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.00