En este video te explicamos en detalle todo el proceso para publicar una Aplicación Android…
SQLite en App Android: actualizar, eliminar y consultar datos
3.
SQLite en App Android: actualizar, eliminar y consultar datos
Continuamos viendo la gestión de una base de datos SQLite, explicando en esta ocasión la actualización, eliminación y consulta de datos desde nuestra aplicación Android.
Recuerda que este contenido forma parte de nuestro curso de Programación de Apps con Android Studio
Actualización de datos
De nuevo, tendremos dos posibilidades para actualizar un registro ya insertado previamente en nuestra base de datos:
Usando de nuevo el método execSQL() pero esta vez pasando como parámetro la sentencia SQL propia para la actualización de un campo.
Usando el método update() que recibe cuatro parámetros:
- El nombre de la tabla
- El objeto ContentValues, que incluye los nuevos datos a modificar
- la condición WHERE de la sentencia SQL
- El cuarto es un caso especial que veremos a continuación en un ejemplo para que se entienda mejor.
Usando el método execSQL() tendríamos lo siguiente:
1 |
db.execSQL("UPDATE comments SET comment='Esto es un comentario actualizado por el método execSQL()' WHERE user='Digital Learning'"); |
Con el método update() tendremos dos formas de hacerlo, y aunque las dos son totalmente viables, la segunda es más recomendable por seguridad. Vamos a verlas:
En primer lugar crearíamos un ContentValues con el valor actualizado como sigue:
1 2 3 |
ContentValues cv = new ContentValues(); cv.put("comment", "Esto es un comentario actualizado por el método update()"); |
y a continuación, tendremos las dos alternativas posibles:
a) Poniendo el cuarto parámetro a null:
1 |
db.update("comments", cv, "user='Academia Android'", null); |
b) O bien usando el cuarto parámetro. En lugar de pasar directamente el argumento de la cláusula WHERE, le indicamos el valor ‘?’ y usamos el cuarto parámentro para indicarle estos argumentos, que en este caso sólo es uno:
1 2 3 |
String[] args = new String []{ "Academia Android"}; db.update("comments", cv, "user=?", args); |
Ambas formas producen el mismo resultado.
El segundo método es más recomendable por seguridad. Separar los valores de la comparación hace nuestro código menos vulnerable a posibles fallos con la sintaxis de la consulta, e incluso mas robusto ante posibles ataques, en caso de que construyamos la consulta de forma dinámica a partir de datos introducidos por el usuario manualmente.
Añadimos el código de la actualización de datos a nuestra aplicación:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
package com.academiaandroid.demodb; import android.app.Activity; import android.content.ContentValues; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MyOpenHelper dbHelper = new MyOpenHelper(this); SQLiteDatabase db = dbHelper.getWritableDatabase(); if (db != null) { // Insert con execSQL db.execSQL("INSERT INTO comments (user, comment) VALUES ('Digital Learning','Esto es un comentario insertado usando el método execSQL()')"); // Insert con ContentValues ContentValues cv = new ContentValues(); cv.put("user", "Academia Android"); cv.put("comment", "Esto es un comentario insertado usando el método insert()"); db.insert("comments", null, cv); // Update con execSQL db.execSQL("UPDATE comments SET comment='Esto es un comentario actualizado por el método execSQL()' WHERE user='Digital Learning'"); // Update con ContentValues cv = new ContentValues(); cv.put("comment", "Esto es un comentario actualizado por el método update()"); String[] args = new String []{ "Academia Android"}; db.update("comments", cv, "user=?", args); } } } |
Eliminación de datos
Para la eliminación de datos tendríamos de nuevo dos posibilidades:
Usar el método execSQL() , pasando como parámetro la sentencia SQL para la eliminación de datos.
Usar el método delete() que recibirá tres parámetros:
- nombre de la tabla
- la cláusula WHERE
- y el tercero, al igual que ocurría con el método update(), serían los argumentos de la cláusula WHERE,si así lo requiere, si no, tomaría el valor null.
Veamos un ejemplo usando ambos métodos, primero con execSQL():
1 2 |
> db.execSQL("DELETE FROM comments WHERE user='Digital Learning'"); |
Y ahora con update() usando el tercer parámetro:
1 2 3 |
> String[] args = new String[]{"Academia Android"}; > db.delete("comments", "user=?", args); |
Consulta de datos
Para consultar los datos almacenados en una base de datos, podremos usar dos métodos:
El método rawQuery() , el cual recibe dos parámetros:
- uno será la sentencia SELECT propia de SQL
- otro que indicará los argumentos de la cláusula WHERE si esta existiera.
El método query() , que recibe nada menos que siete parámetros.
Veámoslo por orden:
- Un string que será el nombre de la tabla sobre la que se realiza la consulta.
- Un array de strings representando las columnas que queremos recuperar. Si pasamos null a este parámetro, devolverá todas las columnas.
- Un string que representa la cláusula WHERE si es necesaria, si no ponemos este parámetro a null.
- Un array de strings representando los argumentos de la cláusula WHERE anterior, si fue null, este, parámetro también será puesto a null.
- Un string que representa la cláusula GROUP BY si es necesario, si no será null.
- Un string que representa la cláusula HAVING si es necesario, si no será null.
- Un string que representa la cláusula ORDER BY si es necesario, si no será null.
Ambos métodos devolverán un objeto de tipo Cursor que contendrá los datos de la consulta.
Veamos un ejemplo usando ambos métodos, empezando por rawQuery():
1 2 |
> Cursor c = db.rawQuery("SELECT _id, user, comment FROM comments", null); |
Y para el caso del método query():
1 2 |
> Cursor c = db.query("comments", new String[]{"_id", "user", "comment"}, null, null, null, null, null); |
Ambos cursores tendrán los mismos datos, que serán todos los de la tabla comments devolviendo los campos user y comment.
Veamos ahora cómo podemos acceder a los datos a través del cursor devuelto.
Para iterar sobre las filas devueltas por un cursor usaremos principalmente dos métodos:
moveToFirst() para posicionarnos al principio del cursor
moveToNext() para movernos a la siguiente fila.
Para obtener los valores de cada fila, usaremos los métodos getString() , getInt() , getFloat() , etc., todas ellas recibiendo como único parámetro un entero que identifica la posición de la columna que queramos obtener.
En nuestro caso, cada fila de la base de datos estaba compuesta por tres columnas:
- columna 0: _id
- columna 1: user
- columna 2: comment
Si no sabemos con exactitud que posición ocupa la columna deseada, podemos recurrir al método getColumnIndex() , que recibe como parámetro una cadena de texto con el nombre de la columna de la cual queramos obtener el dato y devolviendo la posición que ocupa en la fila, y así asegurarnos que estamos obteniendo el valor deseado.
Un detalle importante a tener en cuenta es que una vez finalicemos de manejar el cursor, es conveniente llamar al método close() para cerrarlo y así liberar todos sus recursos no pudiendo hacer uso de él más.
Veamos un ejemplo teniendo en cuenta nuestro cursor creado anteriormente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//Consultamos los datos Cursor c = db.rawQuery("SELECT _id, user, comment FROM comments", null); if (c != null) { c.moveToFirst(); do { //Asignamos el valor en nuestras variables para usarlos en lo que necesitemos String user = c.getString(c.getColumnIndex("user")); String comment = c.getString(c.getColumnIndex("comment")); } while (c.moveToNext()); } //Cerramos el cursor y la conexion con la base de datos c.close(); db.close(); |
Añadimos este código a nuestra aplicación quedando de la siguiente forma:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
package com.academiaandroid.demodb; import android.app.Activity; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MyOpenHelper dbHelper = new MyOpenHelper(this); SQLiteDatabase db = dbHelper.getWritableDatabase(); if (db != null) { // Insert con execSQL db.execSQL("INSERT INTO comments (user, comment) VALUES ('Digital Learning','Esto es un comentario insertado usando el método execSQL()')"); // Insert con ContentValues ContentValues cv = new ContentValues(); cv.put("user", "Academia Android"); cv.put("comment", "Esto es un comentario insertado usando el método insert()"); db.insert("comments", null, cv); // Update con execSQL db.execSQL("UPDATE comments SET comment='Esto es un comentario actualizado por el método execSQL()' WHERE user='Digital Learning'"); // Update con ContentValues cv = new ContentValues(); cv.put("comment", "Esto es un comentario actualizado por el método update()"); String[] args = new String []{ "Academia Android"}; db.update("comments", cv, "user=?", args); //Consultamos los datos Cursor c = db.rawQuery("SELECT _id, user, comment FROM comments", null); if (c != null) { c.moveToFirst(); do { //Asignamos el valor en nuestras variables para usarlos en lo que necesitemos String user = c.getString(c.getColumnIndex("user")); String comment = c.getString(c.getColumnIndex("comment")); } while (c.moveToNext()); } //Cerramos el cursor y la conexion con la base de datos c.close(); db.close(); } } } |
En los próximos tutoriales describiremos un proyecto ejemplo, mostrando la implementación de una base de datos SQLite en una App Android básica.