Inicio Android Bases de Datos en Android (II): Insertar/Actualizar/Eliminar

Bases de Datos en Android (II): Insertar/Actualizar/Eliminar

por sgoliver

En el artículo anterior del curso de programación en Android vimos cómo crear una base de datos para utilizarla desde nuestra aplicación Android. En este segundo artículo de la serie vamos a describir las posibles alternativas que proporciona la API de Android a la hora de insertar, actualizar y eliminar registros de nuestra base de datos SQLite.

La API de SQLite de Android proporciona dos alternativas para realizar operaciones sobre la base de datos que no devuelven resultados (entre ellas la inserción/actualización/eliminación de registros, pero también la creación de tablas, de índices, etc).

El primero de ellos, que ya comentamos brevemente en el artículo anterior, es el método execSQL() de la clase SQLiteDatabase. Este método permite ejecutar cualquier sentencia SQL sobre la base de datos, siempre que ésta no devuelva resultados. Para ello, simplemente aportaremos como parámetro de entrada de este método la cadena de texto correspondiente con la sentencia SQL. Cuando creamos la base de datos en el post anterior ya vimos algún ejemplo de esto para insertar los registros de prueba. Otros ejemplos podrían ser los siguientes:

//Insertar un registro
db.execSQL("INSERT INTO Usuarios (codigo,nombre) VALUES (6,'usuariopru') ");

//Eliminar un registro
db.execSQL("DELETE FROM Usuarios WHERE codigo=6 ");

//Actualizar un registro
db.execSQL("UPDATE Usuarios SET nombre='usunuevo' WHERE codigo=6 ");

La segunda de las alternativas disponibles en la API de Android es utilizar los métodos insert(), update() y delete() proporcionados también con la clase SQLiteDatabase. Estos métodos permiten realizar las tareas de inserción, actualización y eliminación de registros de una forma algo más paramétrica que execSQL(), separando tablas, valores y condiciones en parámetros independientes de estos métodos.

Empecemos por el método insert() para insertar nuevos registros en la base de datos. Este método recibe tres parámetros, el primero de ellos será el nombre de la tabla, el tercero serán los valores del registro a insertar, y el segundo lo obviaremos por el momento ya que tan sólo se hace necesario en casos muy puntuales (por ejemplo para poder insertar registros completamente vacíos), en cualquier otro caso pasaremos con valor null este segundo parámetro.

Los valores a insertar los pasaremos como elementos de una colección de tipo ContentValues. Esta colección es de tipo diccionario, donde almacenaremos parejas de clave-valor, donde la clave será el nombre de cada campo y el valor será el dato correspondiente a insertar en dicho campo. Veamos un ejemplo:

//Creamos el registro a insertar como objeto ContentValues
ContentValues nuevoRegistro = new ContentValues();
nuevoRegistro.put("codigo", "6");
nuevoRegistro.put("nombre","usuariopru");

//Insertamos el registro en la base de datos
db.insert("Usuarios", null, nuevoRegistro);

Los métodos update() y delete() se utilizarán de forma muy parecida a ésta, con la salvedad de que recibirán un parámetro adicional con la condición WHERE de la sentencia SQL. Por ejemplo, para actualizar el nombre del usuario con código ‘6’ haríamos lo siguiente:

//Establecemos los campos-valores a actualizar
ContentValues valores = new ContentValues();
valores.put("nombre","usunuevo");

//Actualizamos el registro en la base de datos
db.update("Usuarios", valores, "codigo=6", null);

Como podemos ver, como tercer parámetro del método update() pasamos directamente la condición del UPDATE tal como lo haríamos en la cláusula WHERE en una sentencia SQL normal.

El método delete() se utilizaría de forma análoga. Por ejemplo para eliminar el registro del usuario con código ‘6’ haríamos lo siguiente:

//Eliminamos el registro del usuario '6'
db.delete("Usuarios", "codigo=6", null);

Como vemos, volvemos a pasar como primer parámetro el nombre de la tabla y en segundo lugar la condición WHERE. Por supuesto, si no necesitáramos ninguna condición, podríamos dejar como null en este parámetro (lo que eliminaría todos los registros de la tabla).

Un último detalle sobre estos métodos. Tanto en el caso de execSQL() como en los casos de update() o delete() podemos utilizar argumentos dentro de las condiones de la sentencia SQL. Éstos no son más que partes variables de la sentencia SQL que aportaremos en un array de valores aparte, lo que nos evitará pasar por la situación típica en la que tenemos que construir una sentencia SQL concatenando cadenas de texto y variables para formar el comando SQL final. Estos argumentos SQL se indicarán con el símbolo ‘?‘, y los valores de dichos argumentos deben pasarse en el array en el mismo orden que aparecen en la sentencia SQL. Así, por ejemplo, podemos escribir instrucciones como la siguiente:

//Eliminar un registro con execSQL(), utilizando argumentos
String[] args = new String[]{"usuario1"};
db.execSQL("DELETE FROM Usuarios WHERE nombre=?", args);

//Actualizar dos registros con update(), utilizando argumentos
ContentValues valores = new ContentValues();
valores.put("nombre","usunuevo");

String[] args = new String[]{"usuario1", "usuario2"};
db.update("Usuarios", valores, "nombre=? OR nombre=?", args);

Esta forma de pasar a la sentencia SQL determinados datos variables puede ayudarnos además a escribir código más limpio y evitar posibles errores.

Para este apartado he continuado con la aplicación de ejemplo del apartado anterior, a la que he añadido dos cuadros de texto para poder introducir el código y nombre de un usuario y tres botones para insertar, actualizar o eliminar dicha información.

demo_app_2

Puedes consultar y/o descargar el código completo de los ejemplos desarrollados en este artículo accediendo a la página del curso en GitHub.

En el siguiente artículo veremos cómo consultar la base de datos para recuperar registros según un determinado criterio.

Curso de Programación Android en PDF

Este curso también está disponible en PDF. Descubre cómo conseguirlo…

¿Te ha sido de utilidad el Curso de Programación Android? ¿Quieres colaborar de forma económica con el proyecto? Puedes contribuir con cualquier cantidad, unos céntimos, unos euros, cualquier aportación será bienvenida. Además, si tu aportación es superior a una pequeña cantidad simbólica recibirás como agradecimiento un documento con la última versión del curso disponible en formato PDF. Sea como sea, muchas gracias por colaborar!

Más información:

También te puede interesar

25 comentarios

Raúl 03/02/2011 - 22:37

Hola, llevo unas cuantas semanas aprendiendo de vuesto buenísimo tutorial para desarrollar en Android, para mí el mejor que encontrado hasta ahora por la red en castellano.

Lo cierto es que he trabajado haciendo algunos servicios web en Java con IBM WebSphere y ahora estoy intentando desarrollar por mi cuenta una aplicación para Android, ya que me parece un tema interesantísimo y con mucho futuro para nosotros los informáticos.

Pero claro, antes de desarrollar hay que analizar y para eso hay que conocer a fondo cada elemento y cada herramienta disponibles en la plataforma, por ejemplo saber qué controles se pueden utilizar (cajas de texto, botones, listas, menus contextuales), cómo se comportan, qué eventos son los más comunes, cómo se pueden personalizar, en definitiva saber sin necesidad de escribir una sola linea de código cómo encajar las piezas en el puzle, es decir, cómo diseñar sobre el papel una pantalla con una cabecera y una lista de detalle por ejemplo.

Para hacer esto me he bajado imágenes de algunas GUI de Android, pero parece ser que según qué versión los controles cambian de aspecto y a veces se comportan de distinta forma.

Por eso me gustaría que pusiéseis algún post dedicado un poco al análisis y al diseño de aplicaciones en Android ya que el tema de la programación veo que lo estáis explicando de maravilla.

Aquí un seguidor vuestro. Un saludo.

Responder
Alberto 07/02/2011 - 11:10

Muchas gracias!

Responder
Bases de Datos en Android (III): Consultar/Recuperar registros | sgoliver.net blog 07/02/2011 - 11:21

[…] el anterior artículo del curso vimos todas las opciones disponibles a la hora de insertar, actualizar y eliminar datos […]

Responder
Desarrollo en Android | sgoliver.net blog 10/02/2011 - 11:41

[…] Bases de datos en Android (II): Inserción, actualización y eliminación de registros […]

Responder
gonzalo 14/04/2011 - 3:32

Antes de nada agradecerte estos magnificos tutoriales (como verás ya estoy terminando esta primera entrega y en breve haré la donación, ya que considero que es de gran valor). No he querido preguntar en todo este tiempo pero sql se me está atragantando.Te formulo una pequeña duda:

Cuando actualizamos el registro de la base de datos:

db.update(«Usuarios», valores, «usuario=’usu1′»);

me indica el siguiente fallo:

«El método update(String, ContentValues, String, String[]) que hay en el tipo SQLiteDatabase no es aplicable para los argumentos (String, ContentValues, String)»

Si añado el argumento «null» al final:
db.update(«Usuarios», valores, «usuario=’usu1′», null);

si funciona pero no se produce la actualización en la db.

Cuál es el problema?

Responder
sgoliver 14/04/2011 - 8:52

Hola Gonzalo,

efectivamente se trata de una error en mi artículo, el método update() siempre recibe los 4 parámetros que indicas: nombre de la tabla, campos-valores a actualizar, condición de actualización, y por último los argumentos variables de la condición [que puede ser null si no hay variables, como en el caso de ejemplo]. Lo mismo ocurre con el método delete(). Lo corrigiré lo antes posible.

Cambiando esto ya debería funcionar la actualización sin problemas. Puedes probar a guardar el valor de retorno del método update, que es el número de registros afectados por la actualización. Algo así como:

int numreg = db.update(“Usuarios”, valores, “usuario=’usu1′”, null);

Si devuelve un valor mayor que 0 significaría que ha realizado correctamente laactualización.

Responder
andres 10/06/2011 - 23:40

Hola,

al final no pude entender el update.. estoy teniendo problemas con eso..
podrian corregir el error.

Muchas Gracias por toda la informacion.
Esta buenisimo

Responder
Dubal 15/06/2011 - 17:59

Hola, quisiera saber como poner las acciones de eliminar/actualizar/consultar dentro de un boton:
asi:

Button Buscar = (Button) findViewById(R.id.btnbus);

Buscar.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
try{
//Abrimos la base de datos
UsuariosSQLiteHelper usdbh =
new UsuariosSQLiteHelper(this, «dbprueba», null, 1);
SQLiteDatabase db = usdbh.getWritableDatabase();
//Si hemos abierto correctamente la base de datos
if(db != null)
{
String[] args = new String[] {id_cliente.getText().toString()};
Cursor c = db.rawQuery(«SELECT * FROM clientes where id=?»,args);
if (c.moveToFirst()) {
//Recorremos el cursor hasta que no haya más registros
do {
id_cliente.setText(c.getString(0));
ci_cliente.setText(c.getString(1));
nombre_cliente.setText(c.getString(2));
} while(c.moveToNext());
}
db.close();
}
}catch(Exception e){
id_cliente.setText(«error»);
ci_cliente.setText(«error»);
nombre_cliente.setText(«error»);
}
}
});

Me da error en context coloco this…ayuda xfa…soy nuevo en esto…Gracias de antemano.

Responder
Rensoft 12/07/2011 - 16:16

Muy bueno, muchisimas gracias…!!!!
es lo que he estado buscando

Responder
aryam 27/09/2011 - 11:39

¿Al actualizar la base de datos se puede insertar en un campo la fecha en la que fue modificado? Es que necesito saber en que momento fue modificado cada registro.

pd: Gracias por el tutorial

Responder
Iván 15/11/2011 - 15:55

Mi duda es, ¿y si quieres usar varios argumentos en el WHERE para actualizar o eliminar…?
Tipo una tabla con 2 campos que componen un PRIMARY KEY (no se si SQLite permite tal tipo de PRIMARY KEY)

Ejemplo sentencia:
UPDATE Usuarios SET email=’nuevo@email.com’ WHERE usuario=’usu1′ AND nombre=’pepe’

Responder
sgoliver 15/11/2011 - 17:53

Hola Iván, te he contestado en el foro. Saludos.

Responder
Swicher 23/12/2011 - 7:12

Aryam, hasta hace poco tenia la misma duda que tu, pero después de buscar y hacer algunas pruebas pude hacerme un trigger que se encarga de eso (ademas de hacer una tarea extra). A continuación te dejo el código del trigger, solamente tienes que adaptar las sentencias y sacarle lo que no necesites (y esta probado al menos en mi caso funciona):
CREATE TRIGGER archiva_y_cambia
/* Este trigger comprueba que si se actualiza un precio en la tabla articulos, entonces se actualiza también el campo fecha_actualizacion y luego se guarda el precio anterior en la tabla cambios_precio (junto con el id del articulo y la fecha de modificación). La base para armar esto provino de http://www.firebird.com.mx/modules/AMS/article.php?storyid=31 */
AFTER UPDATE ON articulos
WHEN OLD.PRECIO NEW.PRECIO
BEGIN
UPDATE articulos
SET fecha_actualizacion = datetime( ‘now’ )
WHERE identificador = new.identificador;

INSERT INTO cambios_precio (
idarticulo,
precio,
modificado
)
VALUES (
new.identificador,
old.precio,
datetime( ‘now’ )
);
END

Responder
Rodri 29/02/2012 - 18:28

Hola, enhorabuena por este tutorial, muy bien explicado todo.
Bueno necesito ayuda porque estoy utilizando una base de datos para mi aplicacion en la cual tengo una tabla que tiene una clave foranea y cuando intento insertar un nuevo registro en esa tabla me da un error. Me podeis orientar un poco de como utilizar foreign key en sqlite.
gracias un saludo.

Responder
Fran 21/02/2013 - 23:06

Hola, escribo para darte las gracias por poner a nuestra disposición este estupento tutorial. Antes de encontrar ese blog compré ún libro e intenté aprender usando otros tuturiales y no fuí capaz de avanzar, sin embargo tus explicaciones y ejemplos son fáciles de seguir lo que me permite aprender y fijar fácilmente los ejemplos.

Dada la utilidad que están teniendo para mi tus explicaciones querría hace una donación y depaso conseguir una copia en pdf, sin embargo desde que me he descubierto el manual no es posible realizar ninguna donación, ¿para cuando tendrás activo de nuevo el sistema de donaciones?

De nuevo muchísimas gracias por el manual. Un saludo.

Responder
Pablo Sánchez Flores 04/02/2014 - 14:10

Gracias por toda tu ayuda, me está ayudando mucho a terminar mi curso de aplicaciones.

Tengo el libro en PDF, es un trabajo excepcional.

Responder
jose 11/02/2014 - 12:20

Hola, en primer lugar agradecerte tu trabajo y dedicación para que podamos aprender algo de Android.

Estoy siguiendo los articulos de android y bases de datos, y tengo una duda:

¿es posible descargarse los ejemplos completos como archivo zip, o algo asi?

lo digo por poder probar lo ejemplos en nuestro eclipse, ya que en la página que nos enlazas (gitHub), sólo hay posibilidad de ver el código carpeta por carpeta…

Gracias.

Responder
sgoliver 11/02/2014 - 15:44

Hola José, si accedes a la página principal del proyecto en GitHub sí aparece la opción de descargar como zip. Saludos.

Responder
jose 11/02/2014 - 17:25

Llevas razón, ahí está.

Muchas gracias de nuevo por la página.

Responder
Sebastian 24/02/2015 - 17:39

como puedo poner un mensaje de que se hayan ingresado los datos ,eliminado o actualizados ?

Responder
Sara 04/07/2015 - 22:57

Tienes algo para comprender mejor como crear y usar Listas?

public List lista() {

String[] cosas = { «id», «carro»};
List resultado = new ArrayList();
final SQLiteDatabase leer = variabledeclase.getReadableDatabase();
final Cursor cursor = leer.query(«nombre», cosas,
null, null, null, null, «id»);
try {
while (cursor.moveToNext()) {
Clase nombre;
nombre = new Clase(cursor.getInt(0),
cursor.getString(1),);
resultado.add(conexion);
}

Responder
Carlos López 28/01/2016 - 5:26

Hola, agradezco por toda tu información es muy ilustrativa. Adicionalmente necesito de tu apoyo para actualizar e insertar registros de una tabla a otra tabla, cada una de ellas pertenecen a bases de datos distintas.

Responder
Carlos López 28/01/2016 - 21:25

Para complementar mi mensaje, te comento que una de las bases se subió a través del assets y la otra se tomo de la memoria externa del celular, lo que intento hacer es actualizar la primer base a través de la segunda de una manera sencilla y sin utilizar mucho código para tal fin.

Responder
Mario German 25/08/2016 - 16:40

Hola agradezco su aporte es de gran ayuda para los que estamos empezando en este medio, tengo la siguiente duda tengo 5 registros, id, nombre, telefono, correo, spinner como puedo guardar el valor del spinner dentro de una base de datos y posteriormente mostrar el dato guardado. Agradezco toda el ayuda que me puedas brindar es de gran ayuda para mi.

Responder
Gonzalez, Francisco 28/06/2017 - 22:32

Que al salvador… en verdad la mejor pagina que he podido encontrar para aprender sobre el tema… todo explicado muy bien y de manera detallada y con buenos ejemplos que ayudan a uno como futuro programador a tener una buena base para ir expandiéndose mas en este campo… gracias por el tiempo que te tomas en difundir lo que te tomo quien sabe cuanto tiempo

saludos desde panama :D

Responder

Responder a andres

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información. Aceptar Más Información

Política de Privacidad y Cookies