Académique Documents
Professionnel Documents
Culture Documents
limpia de SQL y que nos permite trabajar con poca memoria y con una velocidad
bastante decente, características que son necesarias cuando hablamos de entornos
móviles.
SQLite soporta las características estándar de las bases de datos relacionales como la
sintaxis que se basa en SQL, transacciones y la elaboración de consultas. Debido a
esto, cualquier desarrollador que haya trabajado con bases de datos sin importar el
entorno, no encontrará una dificultad especial en trabajar con bases de datos locales en
Android. Por otro lado, hay que dejar en claro que la API nativa de SQLite no es
compatible con JDBC contrario a lo que podría pensarse tomando en cuenta el uso de
Java como lenguaje nativo en aplicaciones Android.
Para conocer los aspectos básicos del manejo de bases de datos en Android, vamos a
dividir este tema en dos artículos. Esta primera parte abarcará nociones teóricas
introductorias del manejo de SQLite en Android. ¡Comencemos!.
Un acercamiento a SQLite
SQLite, como su nombre indica, utiliza el lenguaje SQL para las consultas (SELECT),
manipulación de datos (INSERT, DELETE, etc.), y de definición de datos (CREATE
TABLE, etc). SQLite presenta unas pequeñas variaciones donde se desvía del estándar
SQL-92, que aplica para la mayoría de bases de datos SQL.
Entre ellas, el uso de FOREIGN KEY, transacciones anidadas, RIGHT OTHER JOIN,
FULL OTHER JOIN y algunos usos de ALTER TABLE no son válidas en SQLite.
Debes tomar en cuenta desde el principio que el uso de bases de datos implica tareas de
I/O, que siempre tienen un impacto en el rendimiento de las aplicaciones, por lo que en
ocasiones todo esto puede tornarse lento.
SQLite soporta los tipos de datos TEXT (similar a los String en Java), INTEGER
(similar a Integer en Java) y REAL (similar a Double en Java). Si hacemos uso de
cualquier otro tipo de dato, de manera automática serán convertidos para que sean
compatibles con estos tres tipos de datos.
Las bases de datos en SQLite tienen un nivel de acceso privado que abarca únicamente
la aplicación en la que fueron creadas. En caso de que necesitemos compartir la
información de una base de datos con otra aplicación haremos uso de Content
Providers.
SQLiteOpenHelper
Para crear y trabajar con bases de datos en Android, es necesario hacer uso de la clase
SQLiteOpenHelper. En esta clase es necesario sobreescribir los métodos onCreate()
para crear la base de datos, y onUpgrade() para actualizar la base de datos en caso de
que existan cambios en el esquema de la misma. Ambos métodos reciben como
parámetro un objeto SQLiteDatabase.
Para definir la llave primaria de una base de datos es indispensable hacer uso del
identificador _id ya que muchas de las funciones con las que trabajaremos toman en
cuenta este estándar.
SQLDatabase y Cursor
Las consultas se pueden crear a través del método rawQuery() que acepta como
parámetro una sentencia en SQL o el método query() que proporciona una interfaz para
especificar los datos dinámicos o un objeto de tipo SQLiteQueryBuilder. SQLiteBuilder
es similar a la interfaz de un proveedor de contenidos por lo que suele utilizarse con
Content Providers. Hay que saber también que toda consulta que realicemos nos
retornará un objeto de tipo Cursor.
Por otro lado, el objeto Cursor representa el resultado obtenido de una consulta.
Para conocer el número de elementos que ha retornado la consulta utilizamos el
método getCount().
Para movernos entre las filas individuales de datos utilizamos los métodos
moveToFirst() y moveToNext().
A través del método isAfterLast() se puede comprobar si aún existen datos.
id: INTEGER
Nombre: Text
Apellido: Text
Telefono: Text // También puede ser de tipo INTEGER
E-Mail: Text
Para no hacer tan largo el post por el momento sólo vamos a conectar con la
base de datos e insertar los datos.
Ya esta creado el segundo activity, el cual debe tener 4 text large, 4 editText y
2 botones de la siguiente manera:
Ahora hacemos la función para pasar al segundo activity, es decir pasar del
Principal al segundo Activity, nos vamos al MainActivity.java que es el que hace
referencia al activity_main.xml:
public void pasaSegundo(View view) {
Intent i = new Intent(this, MainActivity2.class ); //MainActiv
ity2 es el nombre del .java
código completo:
package com.bd.bdapp.app;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
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.EditText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
@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();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
package com.bd.bdapp.app;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Created by root on 19/04/14.
*/
public class BD extends SQLiteOpenHelper {
//Constructor de la clase
public BD(Context context, String name, SQLiteDatabase.CursorFacto
ry factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
//Ejecuta query para crear la tabla
db.execSQL(query);
}
@Override
public void onUpgrade(SQLiteDatabase db, int i, int i2) {
db.execSQL("DROP TABLE IF EXISTS personas");
Ahora crearemos otra clase para acceder a la base de datos y manejar los
datos de ésta, vamos a empezar con el método de para inserta, le vamos a
llamar ConexionBD:
package com.bd.bdapp.app;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import java.util.ArrayList;
import java.util.List;
/**
* Created by root on 19/04/14.
*/
public class ConexionBD {
private SQLiteDatabase db;
private Context nContext;
private BD objBD;
//Constructor de la Clase
//Recibe como parámetro una variable de Tipo contexto
// Esto debido a que Para acceder o crear la BD lo pide la Clase S
QLiteOpenHelper
public ConexionBD(Context c){
nContext=c;
try{
String query="INSERT INTO personas(Nombre, Apellido, Telef
ono, Email) VALUES('"+nombre+"','"+apellido+"','"+
telefono+"','"+email+"')";
db.execSQL(query);
resultado=true;
return resultado;
}
catch (Exception e){
resultado=false;
return resultado;
}
}
}
Cerramos Conexión
ObjCnx.cerrarConexion();
}
package com.bd.bdapp.app;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.database.Cursor;
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.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
nombre=(EditText)findViewById(R.id.editText);
apellido=(EditText)findViewById(R.id.editText2);
telefono=(EditText)findViewById(R.id.editText3);
email=(EditText)findViewById(R.id.editText4);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
@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();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
ObjCnx.abrirConexion();
if(ObjCnx.insertar(nombre,apellido,telefono,email)==true){
String texto ="Elemento Agregado Corectamente";
Toast toast = Toast.makeText(this, texto, Toast.LENGTH_LON
G);
toast.show();
}
else{
String texto ="Error al Agregar Elemento";
Toast toast = Toast.makeText(this, texto, Toast.LENGTH_LON
G);
toast.show();
}
ObjCnx.cerrarConexion();
}
}
Capturas de la APP
MainActivity.java
package com.example.practica_android;
import android.os.Bundle;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
SQLiteDatabase Sql;
EditText Codigo;
EditText Nombre;
EditText Telefono;
EditText Direccion;
EditText RUC;
EditText Parametro;
Button Registrar;
Button Actualizar;
Button Consultar;
Button Eliminar;
int opcion=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BaseDatos_Android Bd=new BaseDatos_Android(getApplicationContext(), "BdClientes",
null, 1);
Sql=Bd.getWritableDatabase();
Codigo=(EditText)findViewById(R.id.editText1);
Nombre=(EditText)findViewById(R.id.editText2);
Telefono=(EditText)findViewById(R.id.editText3);
RUC=(EditText)findViewById(R.id.editText4);
Direccion=(EditText)findViewById(R.id.editText5);
Parametro=(EditText)findViewById(R.id.editText6);
Registrar=(Button)findViewById(R.id.button1);
Consultar=(Button)findViewById(R.id.button2);
Actualizar=(Button)findViewById(R.id.button3);
Eliminar=(Button)findViewById(R.id.button4);
}
if(opcion==1){
if (!Cod.trim().equals("") ) {
try {
Sql.execSQL("Insert into Clientes values
('"+Cod+"','"+Nom+"','"+Tel+"','"+Ruc+"','"+Dir+"')");
Toast.makeText(this, "Registro ingresado",
Toast.LENGTH_LONG).show();
} catch (Exception e) {
Toast.makeText(this, "Registro ya existe",
Toast.LENGTH_LONG).show();
}
} else {
}
}
if(opcion==2){
if (!Cod.trim().equals("") ) {
Sql.execSQL("Update Clientes set
Cli_Nombre='"+Nom+"',Cli_Telefono='"+Tel+"',Cli_Ruc='"+Ruc+"',Cli_Direccion='"+Dir+"' " +
"where Cli_Codigo='"+Cod+"'");
Toast.makeText(this, "Registro Actualizado",
Toast.LENGTH_LONG).show();
}else{
Toast.makeText(this, "Faltan datos", Toast.LENGTH_LONG).show();
}
}
if (!Par.trim().equals("")) {
try {
Cursor C;
C = Sql.rawQuery(
"Select Cli_Codigo,
Cli_Nombre,Cli_Telefono,Cli_Ruc,Cli_Direccion from Clientes where Cli_Codigo='" + Par + "'",
null);
C.moveToFirst();
Codigo.setText(C.getString(0));
Nombre.setText(C.getString(1));
Telefono.setText(C.getString(2));
RUC.setText(C.getString(3));
Direccion.setText(C.getString(4));
Toast.makeText(this, "Registro encontrado",
Toast.LENGTH_LONG)
.show();
} catch (Exception e) {
Limpiar();
}
} else {
}
}
BaseDatos_Android.java
package com.example.practica_android;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
@Override
public void onCreate(SQLiteDatabase BD) {
// TODO Auto-generated method stub
BD.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase Db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
Db.execSQL("DROP TABLE IF EXISTS Clientes");
Db.execSQL(CREATE_TABLE);
}
package com.practicasemana12;
import org.apache.http.protocol.ExecutionContext;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import
android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
@Override
public void onCreate(SQLiteDatabase arg0) {
arg0.execSQL("create table "+TA+" (cli_codigo integer primary key
autoincrement," +
"cli_nombre text ," +
"cli_telefono text ," +
"cli_ruc text ," +
"cli_direccion text);");
}
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
}
/*no usados
public void eliminarxruc(String ruc){
datos.execSQL("delete from "+TA+" where cli_ruc='"+ruc+"';");
}
Principal.java
package com.practicasemana12;
import com.vistas.Eliminar;
import com.vistas.Registrar;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
Button b1,b2,b3,b4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_principal);
try {
botones();
} catch (Exception e) {
Toast.makeText(Principal.this, e.toString(),
Toast.LENGTH_LONG).show();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_principal, menu);
return true;
}
void botones(){
b1= (Button)findViewById(R.id.button1);
b2= (Button)findViewById(R.id.button2);
b3= (Button)findViewById(R.id.button3);
b4= (Button)findViewById(R.id.button4);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent s = new Intent("com.vistas.Registrar");
startActivity(s);
}
});
b2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent s = new Intent("com.vistas.Eliminar");
startActivity(s);
}
});
b3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent s = new Intent("com.vistas.Update");
startActivity(s);
}
});
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Eliminar.java
package com.vistas;
import com.practicasemana12.BDHelper;
import com.practicasemana12.R;
import com.practicasemana12.R.layout;
import com.practicasemana12.R.menu;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
sp.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
switch (arg2) {
case 0:
vali="ruc";
break;
case 1:
vali="codigo";
break;
case 2:
vali="nombre";
break;
default:
break;
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
});
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
bh.abrirBD(Eliminar.this);
bh.eliminar(vali, txt.getText().toString().trim());
bh.cerrarBD();
} catch (Exception e) {
Toast.makeText(Eliminar.this, e.toString(),
Toast.LENGTH_LONG).show();
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_eliminar, menu);
return true;
}
Registrar.java
package com.vistas;
import com.practicasemana12.*;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
Button btn;
EditText nombre,telefono,ruc,direcc;
TextView txt1;
BDHelper bh = new BDHelper(Registrar.this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_registrar);
btn=(Button)findViewById(R.id.btnGrabar);
nombre=(EditText)findViewById(R.id.etxtnombre);
telefono=(EditText)findViewById(R.id.etxtelefono);
ruc=(EditText)findViewById(R.id.etxtruc);
direcc=(EditText)findViewById(R.id.etxtdireccion);
txt1=(TextView)findViewById(R.id.textView1);
try {
bh.abrirBD(Registrar.this);
String rp = bh.listar();
txt1.setText(rp);
bh.cerrarBD();
} catch (Exception e) {
Toast.makeText(Registrar.this, e.toString(),
Toast.LENGTH_LONG).show();
}
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
bh.abrirBD(Registrar.this);
String n=nombre.getText().toString().trim();
String t=telefono.getText().toString().trim();
String r=ruc.getText().toString().trim();
String d=direcc.getText().toString().trim();
bh.insertar(n, t, r, d);
bh.cerrarBD();
nombre.setText("");telefono.setText("");ruc.setText("");direcc.setText("");
bh.abrirBD(Registrar.this);
String rp = bh.listar();
txt1.setText(rp);
bh.cerrarBD();
} catch (Exception e) {
Toast.makeText(Registrar.this, e.toString(),
Toast.LENGTH_LONG).show();
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_registrar, menu);
return true;
}
Update.java
package com.vistas;
import com.practicasemana12.BDHelper;
import com.practicasemana12.R;
import com.practicasemana12.R.layout;
import com.practicasemana12.R.menu;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_update);
btn=(Button)findViewById(R.id.button1);
a=(EditText)findViewById(R.id.editText1);
b=(EditText)findViewById(R.id.editText2);
c=(EditText)findViewById(R.id.editText3);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
try {
bh.abrirBD(Update.this);
int cod=Integer.parseInt(a.getText().toString().trim());
String nombre=b.getText().toString().trim();
String direcc=c.getText().toString().trim();
bh.actualizar(cod, nombre, direcc);
bh.cerrarBD();
a.setText("");b.setText("");c.setText("");
} catch (Exception e) {
// TODO: handle exception
}
}
});
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_update, menu);
return true;
}
A continuación detallo, como consumir servicios web con Android. KSOAP2, REST, y
otros modos alternativos e igualmente útiles serán tratados. El mejor a vuestra elección,
según la carga de la API, el dispositivo, ancho de banda disponible, etc..
Bueno... ya estamos listos para utilizarla. Lo primero, vamos a explicar los conceptos
fundamentales.
Ejemplo:
} };