Tutorial CRUD Android + SQLite (IV): Insertar datos desde Formulario

Posted by in Programación Android

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

Para ello veremos los siguientes conceptos:

  • Definir el menú de la actividad para navegar al formulario en modo Inserción
  • Insertar registros en la base de datos SQLite
  • Devolver un resultado desde el Formulario a la actividad principal
  • Refrescar el ListView para mostrar el nuevo registro insertado

 

1: Personalizar Menú Actividad

Editamos el menú de la actividad res/menu/hipoteca.xml para incluir la opción para crear nuevo registro.

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

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

</menu>

Incluimos la nueva cadena en el fichero res/values/strings.xml.

    <string name="menu_crear">Nuevo</string>

Añadimos una nueva propiedad estática a la clase Hipoteca.java que utilizaremos después para indicar la acción a realizar por el formulario.

public class Hipoteca extends ListActivity {
	
	public static final String C_MODO  = "modo" ;
	public static final int C_VISUALIZAR = 551 ;
	public static final int C_CREAR = 552 ;
	
	...
	...
	...

Definimos el método onMenuItemSelected de Hipoteca.java para realizar la llamada a la actividad formulario. La llamada se realiza con el método startActivityForResult porque de esa forma nos permitirá conocer el resultado de la operación realizada desde la actividad llamada.

	@Override
	public boolean onMenuItemSelected(int featureId, MenuItem item)
	{
		Intent i;
		
		switch (item.getItemId())
		{
			case R.id.menu_crear:
				i = new Intent(Hipoteca.this, HipotecaFormulario.class);
				i.putExtra(C_MODO, C_CREAR);
				startActivityForResult(i, C_CREAR);
				return true;
		}
		return super.onMenuItemSelected(featureId, item);
	}

 

2: Insertar registro en SQLite desde Formulario

Comenzamos añadiendo a la clase HipotecaDbAdapter.java el método que utilizaremos para insertar los datos que enviaremos desde el formulario.

	/**
	 * Inserta los valores en un registro de la tabla
	 */
	public long insert(ContentValues reg)
	{
		if (db == null)
			abrir();
		
		return db.insert(C_TABLA, null, reg);
	}

Modificamos el diseño del formulario res/layout/activity_hipoteca_formulario.xml para incluir al final una botonera para Guardar y Cancelar.

	<LinearLayout
        android:id="@+id/botonera"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/observaciones"
        android:gravity="center"
        android:layout_marginTop="20dp"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/boton_cancelar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/boton_cancelar" />

        <Button
            android:id="@+id/boton_guardar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/boton_guardar" />

    </LinearLayout>

Añadimos a la clase Hipoteca.java para añadir las siguientes funcionalidades:

  • Definimos los eventos onClick de los botones
  • Mostramos u Ocultamos la botonera según la acción que estamos realizando
  • Definimos el método guardar que recoge los valores del formulario y llama al Adaptador de la tabla de base de datos
  • Finalizamos la ejecución del formulario devolviendo el control a la actividad principal
package com.sodenet.hipotecas;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class HipotecaFormulario extends Activity {
	
	private HipotecaDbAdapter dbAdapter;
    private Cursor cursor; 
	
	//
    // Modo del formulario
    //
	private int modo ;
	
	//
	// Identificador del registro que se edita cuando la opción es MODIFICAR
	//
	private long id ;
	
	//
	// Elementos de la vista
	//
	private EditText nombre;
	private EditText condiciones;
	private EditText contacto;
	private EditText telefono;
	private EditText email;
	private EditText observaciones;
	
	private Button boton_guardar;
	private Button boton_cancelar;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_hipoteca_formulario);
		
		Intent intent = getIntent();
		Bundle extra = intent.getExtras();

		if (extra == null) return;
		
		//
		// Obtenemos los elementos de la vista
		//
		nombre = (EditText) findViewById(R.id.nombre);
		condiciones = (EditText) findViewById(R.id.condiciones);
		contacto = (EditText) findViewById(R.id.contacto);
		telefono = (EditText) findViewById(R.id.telefono);
		email = (EditText) findViewById(R.id.email);
		observaciones = (EditText) findViewById(R.id.observaciones);

		boton_guardar = (Button) findViewById(R.id.boton_guardar);
		boton_cancelar = (Button) findViewById(R.id.boton_cancelar);
		
		//
		// Creamos el adaptador  
		//
		dbAdapter = new HipotecaDbAdapter(this);
		dbAdapter.abrir();
		
		//
		// Obtenemos el identificador del registro si viene indicado
		//
		if (extra.containsKey(HipotecaDbAdapter.C_COLUMNA_ID))
		{
			id = extra.getLong(HipotecaDbAdapter.C_COLUMNA_ID);
			consultar(id);
		}
		
		//
		// Establecemos el modo del formulario
		//
		establecerModo(extra.getInt(Hipoteca.C_MODO));
		
		//
		// Definimos las acciones para los dos botones
		//
		boton_guardar.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v)
			{
				guardar();
			}
		});
		
		boton_cancelar.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v)
			{
				cancelar();	
			}
		});
		
	}
	
	private void establecerModo(int m)
	{
		this.modo = m ;
		
		if (modo == Hipoteca.C_VISUALIZAR)
		{
			this.setTitle(nombre.getText().toString());
			this.setEdicion(false);
		}
		else if (modo == Hipoteca.C_CREAR)
		{
			this.setTitle(R.string.hipoteca_crear_titulo);
			this.setEdicion(true);
		}
		
	}
	
	private void consultar(long id)
	{
		//
		// Consultamos el centro por el identificador
		//
		cursor = dbAdapter.getRegistro(id);
		
		nombre.setText(cursor.getString(cursor.getColumnIndex(HipotecaDbAdapter.C_COLUMNA_NOMBRE)));
		condiciones.setText(cursor.getString(cursor.getColumnIndex(HipotecaDbAdapter.C_COLUMNA_CONDICIONES)));
		contacto.setText(cursor.getString(cursor.getColumnIndex(HipotecaDbAdapter.C_COLUMNA_CONTACTO)));
		telefono.setText(cursor.getString(cursor.getColumnIndex(HipotecaDbAdapter.C_COLUMNA_TELEFONO)));
		email.setText(cursor.getString(cursor.getColumnIndex(HipotecaDbAdapter.C_COLUMNA_EMAIL)));
		observaciones.setText(cursor.getString(cursor.getColumnIndex(HipotecaDbAdapter.C_COLUMNA_OBSERVACIONES)));
	}
	
	private void setEdicion(boolean opcion)
	{
		nombre.setEnabled(opcion);
		condiciones.setEnabled(opcion);
		contacto.setEnabled(opcion);
		telefono.setEnabled(opcion);
		email.setEnabled(opcion);
		observaciones.setEnabled(opcion);
	}
	
	private void guardar()
	{
		//
		// Obtenemos los datos del formulario
		// 
		ContentValues reg = new ContentValues();
		
		reg.put(HipotecaDbAdapter.C_COLUMNA_NOMBRE, nombre.getText().toString());
		reg.put(HipotecaDbAdapter.C_COLUMNA_CONDICIONES, condiciones.getText().toString());
		reg.put(HipotecaDbAdapter.C_COLUMNA_CONTACTO, contacto.getText().toString());
		reg.put(HipotecaDbAdapter.C_COLUMNA_TELEFONO, telefono.getText().toString());
		reg.put(HipotecaDbAdapter.C_COLUMNA_EMAIL, email.getText().toString());
		reg.put(HipotecaDbAdapter.C_COLUMNA_OBSERVACIONES, observaciones.getText().toString());
		
		if (modo == Hipoteca.C_CREAR)
		{
			dbAdapter.insert(reg);
			Toast.makeText(HipotecaFormulario.this, R.string.hipoteca_crear_confirmacion, Toast.LENGTH_SHORT).show();
		}		
		
		//
		// Devolvemos el control
		//
		setResult(RESULT_OK);
		finish();
	}
	
	private void cancelar()
	{
		setResult(RESULT_CANCELED, null);
		finish();
	}
}

Desde el método guardar se lanza un mensaje informativo que debemos registrar en res/values/strings.xml. También definimos el texto que se mostrará en el formulario en modo creación.

    <string name="hipoteca_crear_titulo">Nueva Hipoteca</string>
    <string name="hipoteca_crear_confirmacion">Hipoteca creada</string>

 

3: Capturar el ActivityResult en la actividad principal

Tanto si se guarda el registro desde el formulario o se cancela la inserción se devolverá el control a la actividad principal con setResult. Para ello, definimos en Hipoteca.java el método onActivityResult.

	@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();
				
			default:
				super.onActivityResult(requestCode, resultCode, data);
		}
	}

 

4: Ejecución de la aplicación

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

android_sqlite_formulario_insertar_1


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