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í: