jueves, 16 de julio de 2015

SQLite en Android

SQLite es lo ideal cuando queremos trabajar con bases de datos en dispositivos móviles. Su uso es bastante sencillo, así que a continuación mostraremos una manera sencilla de manejo de base de datos en Android.
La base de datos que crearemos no tendra mucha dificultad, solo contendrá una sola tabla llamada Alumno, pongo la sintaxis en SQL:
 CREATE TABLE Alumno (Codigo INTEGER PRIMARY KEY,
                         Nombre TEXT NOT NULL,
                         Telefono TEXT NOT NULL,
                         Carrera TEXT NOT NULL);

 Primero crearemos una clase llamada AlmacenBase.java
AlmacenBase.java


package com.example.ultron.practicabasedatos;

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

import java.util.Vector;

/**
 * Created by ultron on 13/07/15.
 */
public class AlmacenBase extends SQLiteOpenHelper {
    public AlmacenBase(Context context) {
        super(context,"AlumnosPro",null,1);
        /*
        Se manda al constructor de la clase padre para genera un entorno lógico de tu base de datos.
        Parametros:
        Contexto: Contexto de la aplicación
        Nombre de la base de datos
        Si se tiene un cursor que se puede utilizar como guia o referencia el objeto es cursorFactory, si no lo hay, null
        Número de versión
         */
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE Alumno (Codigo INTEGER PRIMARY KEY,Nombre TEXT NOT NULL, Telefono TEXT NOT NULL, Carrera TEXT);");
        /*
        Se sobreescribe el metodo onCreate de la clase padre esto con la
        intención de tener una estructura lógica de la base, en memoria ya se creo,
        pero aun no esta almacenada en el teléfono.
         */
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//Control de versiones de la base de datos
    }


}

Ahora crearemos la clase DataBaseManager.java que servirá como ayudante en el manejo de la base de datos.
DataBaseManager.java


package com.example.ultron.practicabasedatos;

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

import java.io.File;

/**
 * Created by ultron on 13/07/15.
 */
public class DataBaseManager {

  //****Clase para administrar la base de datos con la que trabajaremos****//
    /*
    Tablas de la base de datos:
    CREATE TABLE Alumno (Codigo INTEGER PRIMARY KEY,
                         Nombre TEXT NOT NULL,
                         Telefono TEXT NOT NULL,
                         Carrera TEXT NOT NULL);
     */
    String nombre="Nombre",telefono="Telefono",carrera="Carrera",codigo="Codigo";//Variables que serviran como referencias a los atributos de la tabla Alumnos
    AlmacenBase helper; //Clase que realiza la conexion
    SQLiteDatabase db; //Objeto que nos sirve como enlace lógico con la base de datos
    public DataBaseManager(Context context)
    {
        helper=new AlmacenBase(context); //Se crea el objeto de conexion
        db=helper.getWritableDatabase();//Si no existe la base se crea y si existe se habre en modo escritura
    }

    public ContentValues generaContenedorAlumno(int codigoP,String nombreP,String telefonoP,String carreraP)
    {
        /*
        Contenedor que genera un diccionario para los atributos a ingresar a la base de datos
        Un diccionario solo son tublas de elementos con algun significado, en este caso lo estructuramos
        con los parametros que recibimos.
         */
        ContentValues valores=new ContentValues();
        valores.put(codigo,Integer.toString(codigoP));
        valores.put(nombre,nombreP);
        valores.put(telefono,telefonoP);
        valores.put(carrera,carreraP);
        return valores;
    }

    public void insertar(int codigoP,String nombreP,String telefonoP,String carreraP)
    {
        /*
        La inserción de registros a la tabla se realiza con un metodo ya establecido de la clase SQLiteDatabase
        llamado insert, es conveniente y recomendable hacerlo por su facilidad de uso sus parametros:
        Tabla:El nombre de la tabla en la que se realizara la inserción.
        nullColumnHack: El nombre de la o las columnas donde se recibiran valores null, si no los hay, mandar null.
        valores: Los valores, mapeados en un ContentValue para su simplicidad

        El método retornara el ID de la ultima fila insertada se se realizo con exito, de lo contrario
        retornara -1
         */
        //TABLADestino null ContentValues
        db.insert("Alumno", null, generaContenedorAlumno(codigoP, nombreP, telefonoP, carreraP));
    }

    public  void eliminar(int codigoP)
    {
        /*
        Metodo establecido de SQLiteDatabase para eliminar registros:
        Parametros:
        Tabla: La tabla afectada
        Clausula Where: Campo =?   ---->WHERE Campo=
        Argumentos del Where: Como pueden ser varios se utiliza un arreglo de Strings

         */
        //TABLADESTINO  
        db.delete("Alumno", codigo + "=?", new String[]{Integer.toString(codigoP)});
    }

    public void actualiza(int codigoP,String nombreP,String telefonoP,String carreraP)
    {
        /*
        Método para actualizar las filas,
        recibe como parametros:
        Tabla: Tabla afectada.
        Valores: ContentValue con la lista de los valores de la tabla, junto los no actualizados, como si se realisase una insercion.
        Clausula Where: Campo =?   ---->WHERE Campo=
        Argumentos del Where:Como pueden ser varios se utiliza un arreglo de Strings

        Retornara el numero de filas afectadas.
         */
        //TABLADESTINO   
        db.update("Alumno", generaContenedorAlumno(codigoP, nombreP, telefonoP, carreraP), codigo + "=?", new String[]{Integer.toString(codigoP)});
    }
    public Cursor buscar(int codigoP)
    {
        /*
        Este método retornara un Cursor con el resultado de la consulta, los parametros son:
         Tabla: Nombre de la tabla afectada.
         Columns: La lista de las columnas requeridas en un arreglo de Strings
         Selección o condición: Columna =?  -----> WHERE Columna=
         Argumentos de la condición: Arreglo de Strings de los campos a usar como referencia
         groupBy
         having
         orderBy
         limit
         */

        /*****Un Cursor es un contenedor de resultados random para resultados de Querys en SQL*****/
        //TABLABUSQUEDA DATOS_REQUERIDOS  
        String[] columnas=new String[]{codigo,nombre,telefono,carrera};
        return db.query("Alumno",columnas,codigo + "=?",new String[]{Integer.toString(codigoP)},null,null,null,null);
    }

    public void EliminarBase()
    {
        /*
        Para eliminar la base de datos se tiene que hacer un enlace lógico con el directorio de la base
        para eso se pide el directorio con getPath.
        directorio es el enlace lógico.
        deleteDatabase eliminara la base si directorio es diferente de null.
        Retornara true si se concreto la operación, false en caso contrario.
         */
        final String path=db.getPath();
        File directorio=new File(path);
        db.deleteDatabase(directorio);
    }
}


Terminada la creación de estas bases de datos que son esenciales para el funcionamiento de nuestra app, lo siguiente es crear la primera actividad llamada "Agregar.java". Esta actividad servira para agregar registros a nuestra base.
Agregar.java


package com.example.ultron.practicabasedatos;

import android.media.MediaDescription;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;


public class Agregar extends ActionBarActivity {

    AlmacenBase Base;
    EditText nombreTxt,telefonoTxt,CarreraTxt,CodigoTxt;
    Button agregarBtn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_agregar);

        //Referencias al layout
       nombreTxt=(EditText)findViewById(R.id.NombreTxt);
        telefonoTxt=(EditText)findViewById(R.id.TelefonoTxt);
        CarreraTxt=(EditText)findViewById(R.id.CarreraTxt);
        CodigoTxt=(EditText)findViewById(R.id.CodigoTxt);

       agregarBtn=(Button)findViewById(R.id.AgregarAlumnoBtn);

         agregarBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DataBaseManager dbm=new DataBaseManager(getApplicationContext());//Manager de la base de datos
                String nombre=nombreTxt.getText().toString();
                String telefono=telefonoTxt.getText().toString();
                String codigo=CodigoTxt.getText().toString();
                String carrera=CarreraTxt.getText().toString();

                int CodigoEnt=Integer.parseInt(codigo);


                dbm.insertar(CodigoEnt,nombre,telefono,carrera);//Insercion en la base de datos
                nombreTxt.setText("");
                telefonoTxt.setText("");
                CodigoTxt.setText("");
                CarreraTxt.setText("");
                //Limpiamos formulario
            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_agregar, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}


Ahora nos dirigimos al  layout, al activity_agregar.xml por cuestiones de espacio no subiré los xml de la aplicación puedes descargarlos de este link para que te des una idea de como sera diseñada la aplicación.

Ahora crearemos la activity Buscar.java
Buscar.java
package com.example.ultron.practicabasedatos;

import android.database.Cursor;
import android.provider.ContactsContract;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import org.w3c.dom.Text;

import java.util.StringTokenizer;


public class Buscar extends ActionBarActivity {
    AlmacenBase Base;
    Button buscar;
    int Codigo;
    EditText CajaCodigo;
    TextView nombreTV,telefonoTV,carreraTV;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_buscar);

        //Referencias al layout
        buscar=(Button)findViewById(R.id.BuscarBtn);
        CajaCodigo=(EditText)findViewById(R.id.CodigoTxt);
        telefonoTV=(TextView)findViewById(R.id.MuestraTelefonolbl);
        nombreTV=(TextView)findViewById(R.id.MuestraNombreLbl);
        carreraTV=(TextView)findViewById(R.id.MuestraCarreraLbl);
        buscar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            DataBaseManager dbm=new DataBaseManager(getApplicationContext());//Manager para la base de datos
            Codigo=Integer.parseInt(CajaCodigo.getText().toString());//Se obtiene el codigo
                Cursor res=dbm.buscar(Codigo);//Buscamos resultados
                if(res!=null)
                {
                    //Mostramos resultados de la query
                    res.moveToNext();
                    nombreTV.setText("");
                    nombreTV.setText(res.getString(1).toString());

                    telefonoTV.setText("");
                    telefonoTV.setText(res.getString(2).toString());

                    carreraTV.setText("");
                    carreraTV.setText(res.getString(3).toString());
                }

            }
        });
    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_buscar, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

En seguida creamos la activity Modificar.java
Modificar.java

package com.example.ultron.practicabasedatos;

import android.database.Cursor;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;


public class Modificar extends ActionBarActivity {

    Button buscar,actualizar;
    int Codigo;
    EditText nombreTxt,telefonoTxt,carreraTxt,codigoTxt;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_modificar);

        nombreTxt=(EditText)findViewById(R.id.NombreModTxt);
        telefonoTxt=(EditText)findViewById(R.id.TelefonoModTxt);
        carreraTxt=(EditText)findViewById(R.id.CarreraModTxt);
        buscar=(Button)findViewById(R.id.BuscarBtn);
        actualizar=(Button)findViewById(R.id.ActualizarBtn);
        codigoTxt=(EditText)findViewById(R.id.CodigoModTxt);
        buscar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DataBaseManager dbm=new DataBaseManager(getApplicationContext());
                Codigo=Integer.parseInt(codigoTxt.getText().toString());
                Cursor res=dbm.buscar(Codigo);
                if(res!=null)
                {
                    res.moveToNext();
                    nombreTxt.setText("");
                    nombreTxt.setText(res.getString(1).toString());

                    telefonoTxt.setText("");
                    telefonoTxt.setText(res.getString(2).toString());

                    carreraTxt.setText("");
                    carreraTxt.setText(res.getString(3).toString());
                }

            }
        });

        actualizar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DataBaseManager dbm=new DataBaseManager(getApplicationContext());
                int codigo=Integer.parseInt(codigoTxt.getText().toString());
                String nombre=nombreTxt.getText().toString();
                String telefono=telefonoTxt.getText().toString();
                String carrera=carreraTxt.getText().toString();
                dbm.actualiza(codigo,nombre,telefono,carrera);

                nombreTxt.setText("");
                telefonoTxt.setText("");
                carreraTxt.setText("");
            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_modificar, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

Ya casi para terminar el Eliminar.java
Eliminar.java


package com.example.ultron.practicabasedatos;

import android.database.Cursor;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;


public class Eliminar extends ActionBarActivity {

    EditText nombreTxt,telefonoTxt,carreraTxt,codigoTxt;
    Button buscar,eliminar;
    int Codigo=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_eliminar);

        /*
        Referenciamos los elementos del Layout con la clase de java
         */
        nombreTxt=(EditText)findViewById(R.id.NombreElTxt);
        telefonoTxt=(EditText)findViewById(R.id.TelefonoElTxt);
        carreraTxt=(EditText)findViewById(R.id.CarreraElTxt);
        buscar=(Button)findViewById(R.id.BuscarElBtn);
        eliminar=(Button)findViewById(R.id.EliminarElBtn);
        codigoTxt=(EditText)findViewById(R.id.CodigoElTxt);
        /*
        Primero hay que buscar el elemento que se desea eliminar.
         */
        buscar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DataBaseManager dbm = new DataBaseManager(getApplicationContext());//Se invoca a la clase que nos guia a travez de la base de datos
                Codigo = Integer.parseInt(codigoTxt.getText().toString());//Obtenemos el codigo
                Cursor res = dbm.buscar(Codigo);//Buscamos el elemento segun el codigo ingresado
                if (res != null) {
                    //Mostramos resultados
                    res.moveToNext();
                    nombreTxt.setText("");
                    nombreTxt.setText(res.getString(1).toString());

                    telefonoTxt.setText("");
                    telefonoTxt.setText(res.getString(2).toString());

                    carreraTxt.setText("");
                    carreraTxt.setText(res.getString(3).toString());
                }

            }
        });

        eliminar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DataBaseManager dbm = new DataBaseManager(getApplicationContext());//Se declara el manager de la base de datos
                dbm.eliminar(Codigo);//Eliminamos usando el codigo como parametro
            }
        });
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_eliminar, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

Por ultimo nos vamos a nuestro MainActivity.java
MainActivity.java


package com.example.ultron.practicabasedatos;

import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;


public class MainActivity extends ActionBarActivity {
    Button agregar,buscar,modificar,eliminar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        DataBaseManager dbm=new DataBaseManager(this);
        agregar=(Button)findViewById(R.id.AgregarBtn);
        buscar=(Button)findViewById(R.id.BuscarBtn);
        modificar=(Button)findViewById(R.id.ModificarBtn);
        eliminar=(Button)findViewById(R.id.EliminarBtn);

        agregar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this, Agregar.class);
                startActivity(i);


            }
        });

        buscar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this, Buscar.class);
                startActivity(i);


            }
        });

        modificar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this, Modificar.class);
                startActivity(i);


            }
        });

        eliminar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this, Eliminar.class);
                startActivity(i);


            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}


Ahora en nuestro AndroidManifest.xml agregamos el permiso de escritura y lectura en almacenamiento externo.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Y nuestra aplicación se tiene que ver así:





No hay comentarios:

Publicar un comentario