Operaciones básicas sobre bbdd desde Android

Insertar datos en la bbdd

Siguiendo con nuestro ejemplo, tenemos la necesidad de insertar un producto en nuestra base de datos. Para ello nos ayudamos de la función InsertarProducto la cual requiere una cadena de texto con el nombre del producto, un entero indicando la cantidad de producto y otra cadena de texto indicando la descripción del producto.

 // Función que nos permite insertar en la bbdd los datos introducidos por el
 // usuario
 private void InsertarProducto(String nom, int can, String desc) {

El siguiente paso será crear una instancia de la base de datos ayudándonos de la clase DatabaseHelper_almacen definida anteriormente. Además, para poder escribir en ella hemos de solicitarlo, llamando a la función getWritableDatabase().

 // Creamos una instancia de la bbdd
 // y solicitamos escribir en ella
 DatabaseHelper_almacen databasehelper = new DatabaseHelper_almacen(this);
 SQLiteDatabase db = databasehelper.getWritableDatabase();

A continuación definimos el objeto llamado cv el cual almacena para cada nombre de columna un valor en concreto. En nuestro caso, para cada una de las columnas definidas para nuestra tabla, hacemos corresponder los datos que queremos insertar en la tabla.

 // Definimos cv como un objeto que hace corresponder nombres de columna
 // a datos en dichas columnas, donde almacenamos los datos a insertar
 ContentValues cv = new ContentValues();
 cv.put(DatabaseHelper_almacen.NOMBRE, nom);
 cv.put(DatabaseHelper_almacen.CANTIDAD, can);
 cv.put(DatabaseHelper_almacen.DESCRIPCION, desc);

Usamos el método insert para insertar los datos en la base de datos. Dicho método recibe 3 parámetros: una cadena de texto con el nombre de la tabla, una de las columnas de la tabla y los datos a insertar. La función devuelve el _id de la fila insertada; en el caso de que haya ocurrido algún error devuelve -1. Por ello usamos la estructura try-catch y de esta manera capturamos la excepción que se genera, sacando un mensage de error por pantalla en el LogCat.

 // Usaremos el método insert para insertar los datos.
 try{
   db.insert(DatabaseHelper_almacen.tabla, DatabaseHelper_almacen.NOMBRE, cv);
 } catch(SQLException e) {
   android.util.Log.v("BBDD", "Error al insertar los datos " + e);
 }

Por último cerramos la base de datos.

 // Cerramos la base de datos
 db.close();
 }

 

Seleccionar datos de la bbdd

Tomando como referencia nuestra ejemplo, la siguiente función realiza una consulta a la base de datos de todos aquellos productos que cumplen el tener la misma descripción. La función ConsultarProducto toma como parámetro una cadena de texto del patrón a buscar en la bbdd y devuelve una cadena de texto con el resultado obtenido.

 // Función que nos permite realizar una consulta en la bbdd de todos
 // aquellos productos que sean de la misma temporada que el producto
 // insertado
 private String ConsultarProducto(String texto) {

Creamos una instancia de la base de datos ayudándonos de la clase DatabaseHelper_almacen definida anteriormente y  llamando a la función getReadableDatabase() se nos permite hacer consultas en ella.

 // Creamos una instancia de la bbdd
 // y solicitamos leerla
 DatabaseHelper_almacen databasehelper = new DatabaseHelper_almacen(this);
 SQLiteDatabase db = databasehelper.getReadableDatabase();

Formamos la query que necesitemos a la base de datos como un texto usando la función rawQuery la cual devuelve un objeto de tipo cursor. Dicha función requiere como primer parámetro la sentencia sql sin finalizar por ; y como segundo parámetro los argumentos a los cuales se les haya referido como ? en la query; ha de ser un array de strings.

 // Creamos la instrucción sql de consulta como un texto plano
 Cursor c = db.rawQuery(" SELECT " + DatabaseHelper_almacen.NOMBRE
    + ", " + DatabaseHelper_almacen.CANTIDAD + ", "
    + DatabaseHelper_almacen.DESCRIPCION + " FROM "
    + DatabaseHelper_almacen.tabla + " WHERE "
    + DatabaseHelper_almacen.DESCRIPCION + " ='" + texto
    + "' ORDER BY " + DatabaseHelper_almacen.CANTIDAD, null);

El código anterior puede ser reemplazado por el siguiente obteniéndose el mismo resultado

  String[] texto_array = {texto};
  Cursor c = db.rawQuery(" SELECT " + DatabaseHelper_almacen.NOMBRE
     + ", " + DatabaseHelper_almacen.CANTIDAD + ", "
     + DatabaseHelper_almacen.DESCRIPCION + " FROM "
     + DatabaseHelper_almacen.tabla + " WHERE "
     + DatabaseHelper_almacen.DESCRIPCION + " = ?" 
     + " ORDER BY " + DatabaseHelper_almacen.CANTIDAD, texto_array);

El siguiente paso es almacenar en la cadena resultado los datos devueltos por la consulta. La función moveToFirst() mueve el cursor a la primera línea, devolviendo false en caso de que el cursor esté vacío. La función moveToNext() nos permite movernos a la siguiente fila

 String resultado = "";
 if (c.moveToFirst()) {
    // Recorremos el cursor hasta que no haya más registros y los
    // almacenamos en la variable resultado
    do {
       String Producto = c.getString(0);
       String Cantidad = c.getString(1);
       String Descripción = c.getString(2);
       resultado = resultado + "\n" + Producto + " - " + Cantidad
          + "-" + Descripción + "\n";
    } while (c.moveToNext());
 }

Por último cerramos la base de datos y devolvemos el resultado como una cadena de texto.

 // Cerramos la base de datos
 db.close();
 // Devolvemos el resultado de la consulta
 return resultado;
 }

 

Actualizar datos en la bbdd

Siguiendo con el ejemplo la función onModificarclick se encarga de actualizar un producto en la base de datos, bien su nombre, cantidad o descipción cuando el usuario pulsa el botón Modificar producto.

 // Es llamada cuando el usuario pulsa el botón de Modificar producto
 public void onModificarclick(View view) {

Recuperamos la/s opción/es elegida/s por el usuario sobre qué características actualizar. Para ello se han utilizado checkbox.

 CheckBox mod_producto = (CheckBox) findViewById(R.id.nombre_nuevo);
 CheckBox mod_cantidad = (CheckBox) findViewById(R.id.cantidad_nueva);
 CheckBox mod_descripcion = (CheckBox) findViewById(R.id.cambio_temporada);

Seguidamente, creamos una instancia de la base de datos y solicitamos permiso para escribirla.

 DatabaseHelper_almacen databasehelper = new DatabaseHelper_almacen(this);
 SQLiteDatabase db = databasehelper.getWritableDatabase();

Definimos el objeto cv donde almacenaremos los nuevos datos a almacenar.

 ContentValues cv = new ContentValues();

Con una secuencia if–else comprobamos qué checkboxes han sido seleccionados y actualizamos los datos usando el método update. Dicho método recoge 4 parámetros. El primero de ellos se corresponde con el nombre de la tabla sobre la que realizar los cambios; el segundo parámetro indica el objeto cv con los datos nuevos a modificar; el tercer parámetro indica la sentencia WHERE, donde vamos a realizar los cambios y por último el cuarto parámetro corresponde con los argumentos ? indicados por la sentencia WHERE. Dicha función devuelve el número de filas modificadas en la tabla. Importante, si no indicamos en el tercer parámetro dónde realizar los cambios, se actualizarán todas las filas de la tabla. En el caso de que se produzca una excepción, la capturamos y la mostramos en el LogCat.

 if (mod_producto.isChecked() == true) {
    EditText editText = (EditText) findViewById(R.id.nombreproducto_nuevo);
    String nuevo_producto = editText.getText().toString();
    cv.put(DatabaseHelper_almacen.NOMBRE, nuevo_producto);
    String[] whereArgs = new String[] { id_producto };
 try {
    db.update(DatabaseHelper_almacen.tabla, cv, "_id=?", whereArgs);
 } catch (SQLException e) {
    android.util.Log
       .v("BBDD", "Error al actualizar los datos " + e);
 }
 }
 if (mod_cantidad.isChecked() == true) {
    EditText editText = (EditText) findViewById(R.id.numcantidad_nueva);
    String nuevo_cantidad = editText.getText().toString();
    int cantidad_nueva = 0;
    try {
       cantidad_nueva = Integer.parseInt(nuevo_cantidad);
    } catch (NumberFormatException nfe) {
       System.out
         .println("No se ha podido convertir el integer" + nfe);
    }
    cv.put(DatabaseHelper_almacen.CANTIDAD, cantidad_nueva);
    String[] whereArgs = new String[] { id_producto };
   try {
       db.update(DatabaseHelper_almacen.tabla, cv, "_id=?", whereArgs);
   } catch (SQLException e) {
      android.util.Log
         .v("BBDD", "Error al actualizar los datos " + e);
   }
 }
 if (mod_descripcion.isChecked() == true) {
    String descripcion_nueva = "Temporada invierno";
    if (descripcion.endsWith("verano")) {
       descripcion_nueva = "Temporada invierno";
    } else if (descripcion.endsWith("invierno")) {
       descripcion_nueva = "Temporada verano";
    }
    cv.put(DatabaseHelper_almacen.DESCRIPCION, descripcion_nueva);
    String[] whereArgs = new String[] { id_producto };
   try {
       db.update(DatabaseHelper_almacen.tabla, cv, "_id=?", whereArgs);
   } catch (SQLException e) {
       android.util.Log
          .v("BBDD", "Error al actualizar los datos " + e);
   }
 }

Por último cerramos la base de datos.

 // Cerramos la base de datos
 db.close();
}

 

Borrado de datos de la bbdd

En caso de que el usuario elija borrar un producto de la base de datos, procederemos de la siguiente manera. Haremos uso de la función onBorrarclick, la cual es llamada cuando el usuario pulsa un botón de su interfaz móvil.

 // Es llamada cuando el usuario pulsa el botón de Borrar producto
 public void onBorrarclick(View view) {

Al igual que en las operaciones anteriores, creamos una instancia de la base de datos y solicitamos acceso de escritura.

 // Creamos la instancia de la bbdd
 // y solicitamos permisos para escribir en ella
 DatabaseHelper_almacen databasehelper = new DatabaseHelper_almacen(this);
 SQLiteDatabase db = databasehelper.getWritableDatabase();

Definimos un array de strings donde almacenamos el _id del producto a borrar

 // Definimos el parámetro whereArgs que indica qué _id del producto
 // vamos a borrar
 String[] whereArgs = new String[] { id_producto };

Usamos el metodo delete para borrar el producto en cuestión. Dicha función recibe 3 atributos. El primero es el nombre de la tabla sobre la que realizar la operación, el segundo corresponde con la sentencia WHERE, es decir indicamos donde borrar (importante! si pasamos como parámetro null, se borrarán todas la filas). El tercer parámetro indica los argumentos por los que sustituir ? en el segundo atributo. La fucnión devuelve el número de filas borradas según la condición indicada. En el caso de que se produzca algún error, capturamos la excepción y la mostramos en el LogCat.

 try {
    db.delete(DatabaseHelper_almacen.tabla, "_id=?", whereArgs);
 } catch (SQLException e) {
    android.util.Log.v("BBDD", "Error al borrar los datos " + e);
 }

El siguiente paso será cerrar la base de datos.

 // Cerramos la base de datos
 db.close();