Tutorial CRUD Android + SQLite (V): Eliminar registros desde formulario

Posted by in Programación Android

Siguiendo con el Tutorial Android + SQLite en la entrada anterior vimos cómo insertar registros de la base de datos SQLite desde un formulario, en esta nos centraremos en cómo eliminar registros en una base de datos SQLite desde un formulario.

Para ello veremos los siguientes conceptos:

  • Cargar el menú indicado para la acción del formulario
  • Eliminar registros en la base de datos SQLite
  • Devolver un resultado desde el formulario a la actividad principal
  • Refrescar el ListView para ocultar el registro eliminado

 

1: Definir varios menús para una actividad

Puesto que la actividad formulario puede lanzarse para visualizar o borrar registros las opciones del menú deben ser diferentes. Por ello definiremos dos menús y cargaremos en onPrepareOptionsMenu el que corresponda.

El menú el formulario en modo visualización lo definiremos en res/menu/hipoteca_formulario_ver.xml y tendrá la opción eliminar mientras que el menú para el modo inserción lo llamaremos res/menu/hipoteca_formulario_editar.xml y tendrá las opciones guardar y cancelar. Lo llamamos editar porque reutilizaremos el menú para añadir nuevas opciones en próximos entradas.

res/menu/hipoteca_formulario_ver.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item 
        android:id="@+id/menu_eliminar"
		android:title="@string/menu_eliminar" />

</menu>

src/Hipoteca.java
res/menu/hipoteca_formulario_editar.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    	<item
		    android:id="@+id/menu_guardar"
		    android:title="@string/menu_guardar" />
    	
    	<item 
		    android:id="@+id/menu_cancelar"
		    android:title="@string/menu_cancelar" />
    	
</menu>

Incluimos las nuevas cadenas en el fichero res/values/strings.xml.
src/Hipoteca.java

    <string name="menu_guardar">Guardar</string>
    <string name="menu_cancelar">Cancelar</string>
    <string name="menu_eliminar">Eliminar</string>

 

2: Cargar menú en el método onPrepareOptionsMenu

Como indicabamos antes, dependiendo de la acción del formulario cargaremos el menú correspondiente en el método onPrepareOptionsMenu. Para ello modificamos src/HipotecaFormulario.java añadiendo lo que sigue a continuación.

...
...
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {

		menu.clear();
	    
		if (modo == Hipoteca.C_VISUALIZAR)
			getMenuInflater().inflate(R.menu.hipoteca_formulario_ver, menu);
		
		else
			getMenuInflater().inflate(R.menu.hipoteca_formulario_editar, menu);
		
		return true;
	}
...
...

 

3: Definir acciones del menú en el método onMenuItemSelected

En el método onMenuItemSelected capturaremos la opción pulsada del menú y realizaremos la acción que corresponda en cada caso, entre ellas la nueva acción borrar. Para ello modificamos src/HipotecaFormulario.java añadiendo lo que sigue a continuación.

...
...
	@Override
	public boolean onMenuItemSelected(int featureId, MenuItem item) {
		
		switch (item.getItemId())
		{
			case R.id.menu_eliminar:
				borrar(id);
				return true;
				
			case R.id.menu_cancelar:
				cancelar();
				return true;
				
			case R.id.menu_guardar:
				guardar();
				return true;
		}
		
		return super.onMenuItemSelected(featureId, item);
	}
	@Override
	public boolean onMenuItemSelected(int featureId, MenuItem item) {
		
		switch (item.getItemId())
		{
			case R.id.menu_eliminar:
				borrar(id);
				return true;
				
			case R.id.menu_cancelar:
				cancelar();
				return true;
				
			case R.id.menu_guardar:
				guardar();
				return true;
		}
		
		return super.onMenuItemSelected(featureId, item);
	}
...
...

 

4: Eliminar registro con mensaje de confirmación

La eliminación del registro la haremos solicitando previamente una confirmación por parte del usuario con un AlertDialog. Para ello modificamos src/HipotecaFormulario.java añadiendo lo que sigue a continuación.

...
...
	private void borrar(final long id)
	{
		/**
		 * Borramos el registro con confirmación
		 */
		AlertDialog.Builder dialogEliminar = new AlertDialog.Builder(this);
		
		dialogEliminar.setIcon(android.R.drawable.ic_dialog_alert);
		dialogEliminar.setTitle(getResources().getString(R.string.hipoteca_eliminar_titulo));
		dialogEliminar.setMessage(getResources().getString(R.string.hipoteca_eliminar_mensaje));
		dialogEliminar.setCancelable(false);
		
		dialogEliminar.setPositiveButton(getResources().getString(android.R.string.ok), new DialogInterface.OnClickListener() {

			public void onClick(DialogInterface dialog, int boton) {
				dbAdapter.delete(id);
				Toast.makeText(HipotecaFormulario.this, R.string.hipoteca_eliminar_confirmacion, Toast.LENGTH_SHORT).show();
				/**
				 * Devolvemos el control
				 */
				setResult(RESULT_OK);
				finish();
			}
		});
		
		dialogEliminar.setNegativeButton(android.R.string.no, null);
		
		dialogEliminar.show();
		
	}
...
...

Incluimos las nuevas cadenas en el fichero res/values/strings.xml.

    <string name="hipoteca_eliminar_titulo">Eliminar Hipoteca</string>
    <string name="hipoteca_eliminar_mensaje">¿Seguro que desea eliminar la Hipoteca?</string>
    <string name="hipoteca_eliminar_confirmacion">Hipoteca eliminada</string>

Ahora solamente nos falta incluir el método delete en la clase src/HipotecaDbAdapter.java

...
...
	/**
	 * Eliminar el registro con el identificador indicado
	 */
	public long delete(long id)
	{
		if (db == null)
			abrir();
		
		return db.delete(C_TABLA, "_id=" + id, null);
	}
...
...

 

5: Refrescar el ListView de la actividad principal

Como hemos visto anteriormente, al borrar el registro se devuelve el control a la actividad principal con el método setResult. Modificaremos el método onActivityResult de la actividad src/Hipoteca.java para refrescar la información de la lista cuando volvamos del formulario en modo Visualización.

...
...
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data)
	{
		//
		// Nos aseguramos que es la petición que hemos realizado
		//
		switch(requestCode)
		{
			case C_CREAR:
				if (resultCode == RESULT_OK)
					consultar();
				
			case C_VISUALIZAR:
				if (resultCode == RESULT_OK)
					consultar();
				
			default:
				super.onActivityResult(requestCode, resultCode, data);
		}
	}
...
...

 

6: Ejecución de la aplicación

¡Ya está todo listo! Ahora basta con ejecutar la aplicación en el emulador.

android_sqlite_formulario_eliminar_1

 
Si tienes alguna pregunta o algo que aportar no lo dudes … ¡tienes los comentarios a tu disposición!