You are on page 1of 50

Tutorial Android + SQLite

http://notasprogramacion.sodenet.es/tutorial-android-sqlite/

Cómo instalar entorno de desarrollo android
09/15/2012 12:41 ⋅ 3 Comentarios ⋅ pmon

Explicamos a continuación cómo instalar el entorno de desarrollo Android sobre Ubuntu 12.04 64-bit. No obstante, si tenéis que realizar la instalación sobre otro Sistema Operativo basta con buscar en Google, hay una infinidad de recursos a un click de distancia. Inténtalo, vale la pena!!

Adjunto imagen con detalles de mi equipo

Paso 1: Instalar Eclipse
Basta con abrir un Terminal e instalar desde apt-get: sudo apt-get install eclipse

Paso 2: Abrir Eclipse y consultar versión instalada
Abrimos Eclipse y consultamos la versión del mismo desde Help > About Eclipse Platformy veremos una pantalla como la que sigue en la cual se indica la versión de Eclipse. En nuestro caso 3.7

Paso 3: Instalamos los paquetes de Software desde Eclipse
Vamos a Help > Install New Software …y allí indicamos la ruta desde la que instalaremos los paquetes necesarios. En nuestro caso indicando la versión 3.7:https://dl.google.com/eclipse/plugin/3.7 Instalamos los paquetes Developer Tools, Google Plugin for Eclipse y SDKs

Cuando termine la instalación solicitará reiniciar eclipse.

Paso 4: Instalación automática de SDK Android
Tras el reinicio de eclipse aparecera el asistente de instalación del SDK, bastará con darle a siguiente y finalizar la instalación.

Paso 5: Configuración de AVD
El último paso consite en configurar un dispositivo virtual Android que utilizaremos para probar las aplicaciones sin necesidad de instalarlas en nuestro dispositivo. Para ello vamos a Window > AVD Managery creamos los dispositivos que necesitemos tal y como se ve en la imagen

Una vez completados todos los pasos ya tenemos listo el entorno de desarrollo para comenzar nuestra aplicación ….

Hola Mundo Android
12/01/2012 19:37 ⋅ 1 Comentario ⋅ pmon

Como no podía ser de otra forma, nuestro primer programa en Android será el típico y archiconocido Hola Mundo. Para ello comenzaremos por abrir nuestro IDE Eclipse para android que ya vimos como instalar en el post anterior Instalar entorno de desarrollo Android.

Paso 1: Creamos el nuevo proyecto Android
Para quien todavía no esté familiarizado con las opciones básicas de eclipse: File – New – Project y dentro de la carpeta Android seleccionamos Android Application Project y pulsamos Siguiente.

Indicamos el nombre del proyecto y el resto de opciones por defecto.

 

Build SDK: versión del SDK con el que se va a compilar el proyecto. Minimun Required SDK: versión mínima de Android en la que podrá ejecutarse la aplicación.

Title: El título que se le pondrá por defecto a la Pantalla. Layout Name: Nombre del xml que define los elementos visuales de la Activity.java correspondiente a la Activity.Pulsamos Siguiente y aparece el asistente para crear la Activity principal.    Activity Name: Nombre que recibirá la clase . Volvemos a pulsar Siguiente con las opciones por defecto y nos lleva a la pantalla desde la que daremos nombre a la Activity. Explico alguno de los campos que aparecen en esta pantalla ya que darán nombre a distintas partes del código de nuestra aplicación. . Una Activity es cada una de las pantallas que forman nuestra aplicación.

.Paso 2: Revisamos el código generado por el asistente Al completar el asistente se ha creado un proyecto de ejemplo que incluye el texto Hello World en pantalla así que lo aprovecharemos para visualizar las diferentes partes de código del proyecto.

o o o HolaMundoAndroid Hello world! Settings . Por el momento no haremos nada con él.Inicio" /> 1 0  res/values/strings.example.java: Es la clase Inicio. 1 2 <xmlns:tools="http://schemas. la propia etiqueta hello world y el título de la activity Inicio.holamundoandroid/Inicio.xml: Es el fichero de layout que define la visualización de la activity.android. En el podéis observar que se definen tanto las etiquetas de nombre de la aplicación.com/tools" 3 android:layout_width="match_parent"android:layout_height="match_par 4 ent" > 5 <TextView android:layout_width="wrap_content" 6 android:layout_height="wrap_content" 7 android:layout_centerHorizontal="true" android:layout_centerVertical="true" 8 android:text="@string/hello_world" 9 tools:context=".xml: En este fichero se definen las etiquetas de texto que se van a utilizar en la aplicación. Eclipse permite trabajar sobre esta pantalla en modo gráfico o edición l xml.o o src/com. en ella incluiremos el código relacionado con la activity. res/layout/activity_inicio.

xml: Añadimos los textos de los nuevos elementos     HolaMundoAndroid Settings Inicio Introduce tu nombre . Tras un tiempo de espera aparece el emulador Android con nuestra aplicación.o Inicio Paso 3: Ejecutamos la aplicación en el AVD Ya se explicó en la configuración del AVD en el Paso 5 de Instalación de entorno de desarrollo Android así que si no lo tienes configurado vuelve a él. Para ejecutarlo pulsamos sobre Run o Control + F11. Paso 4: Modificamos el código del proyecto a nuestro gusto ¿Cómo íbamos a terminar nuestro primer programa sin haber tirado ni una sola línea de código? …. ¡¡¡Que no se diga!!! Ahora vamos a escribir un poco de código para terminar nuestro Hola Mundo Android con un buen sabor de boca … ¿Y qué vamos a hacer? Pondremos un campo para rellenar nuestro nombre y un botón que al pulsarlo muestre el texto: Hola Mundo Android … saludos de xxxxxxxxxx strings.

com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <EditText android:id="@+id/nombre" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/boton_saludar" android:layout_alignBottom="@+id/boton_saludar" android:layout_alignParentLeft="true" android:hint="@string/hint_nombre" /> <Button android:id="@+id/boton_saludar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:text="@string/texto_boton_saludar" android:onClick="saludar"/> <TextView android:id="@+id/saludo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" /> Prestad especial atención a la propiedad android:onClick=”saludar” del botón. import android.xml 1 2 3 4 5 6 7 8 9 10 package com.holamundoandroid.example. import android.TextView. Saluda activity_inicio. import android. public class Inicio extends Activity { @Override .widget. import android. Esta propiedad desencadenará la llamada al método saludar de la clase Inicio.android.os.java: Añadimos el método saludar que se encargará de recoger el valor del nombre y rellenar el saludo en el TextView de activity_inicio.Menu.xml: Incluimos los nuevos controles 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 <xmlns:tools="http://schemas.view.widget. import android.class Inicio.app.view.Activity.Bundle.EditText.View. import android.

id.id.getText(). } } En el método saludar declaramos dos objetos de tipo nombre y saludo que obtenemos de la vista mediante findViewById Construimos después el saludo incluyendo en el texto del nombre si se ha rellenado.onCreate(savedInstanceState). El resultado aquí lo tenéis!!! . } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().activity_inicio..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 public void onCreate(Bundle savedInstanceState) { super.layout. // construimos el saludo String mensaje = "Hola Mundo Android" .setText(mensaje). // si el nombre no está vacío lo añadimos if (nombre.menu.nombre). Visualizamos el mensaje en el TextView.saludo). setContentView(R.toString() .inflate(R. menu). return true..getText().length() > 0){ mensaje += " . } // rellenamos el saludo saludo. TextView saludo = (TextView) findViewById(R. } public void saludar(View view){ // recuperamos los objetos de la visa EditText nombre = (EditText) findViewById(R. saludos de " + nombre.activity_inicio).

apk .Puedes descargar la aplicación del ejemplo desde aquí HolaMundoAndroid.

Por tanto vamos a crear una aplicación Android con las operaciones básicas para guardar y mantener información en una base de datos SQLite:     Crear Registros Obtener Registros Actualizar Registros Borrar Registros La aplicación de ejemplo consistirá en una lista en la que introduciremos las condiciones bancarias que nos han ofrecido en diferentes entidades para la solicitud de una hipoteca. Esta clase gestiona la creación de la base de datos la primera vez que se accede a la misma con el método onCreate y la actualización de la base de datos cuando se detecte un cambio de versión de la misma con el método onUpdate. Read.Tutorial CRUD Android + SQLite (I): Crear la base de datos 03/22/2013 20:15 ⋅ 2 Comentarios ⋅ pmon Esta es la primera parte de tutorial en las que detallaremos paso a paso la creación de una aplicación CRUD con Android + SQLite. . actualización y conexión de la base de datos se realiza desde la aplicación a través de una clase que hereda de SqliteOpenHelper. ¿Qué es un CRUD Android + SQLite? CRUD es el acrónimo de Create. Update y Delete. 1: Nuevo Proyecto Android No entramos en detalle para la creación de un nuevo proyecto Android. 2: Clase controladora de base de datos para SQLite La creación. Si no tienes claro cómo hacerlo puedes revisar la entrada anterior Hola Mundo Android. Hemos llamado a la clase HipotecaDbHelper.

} @Override public void onCreate(SQLiteDatabase db) { } @Override public void onUpgrade(SQLiteDatabase db.SQLiteDatabase.CursorFactory. public class HipotecaDbHelper extends SQLiteOpenHelper { private static int version = 1.database. private static String name = "HipotecaDb" .content.Context.sqlite.SQLiteDatabase. android.En esta clase declaramos 3 propiedades que utilizaremos en el constructor de la misma: 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 package com. android. version).SQLiteOpenHelper. public HipotecaDbHelper(Context context) { super(context.database. int newVersion) { } } .sodenet. factory.sqlite.database.hipotecas. android. int oldVersion. name. import import import import android. private static CursorFactory factory = null.sqlite.

'BBVA')").i(this. VALUES(2. hip_telefono: Teléfono de contacto.execSQL("INSERT INTO HIPOTECA(_id. VALUES(5. db. db.execSQL("INSERT INTO HIPOTECA(_id.'La hip_nombre) hip_nombre) . "Tabla HIPOTECA creada"). db. " + " hip_contacto TEXT. /* * Insertamos datos iniciales */ db. hip_nombre: Nombre del registro. VALUES(1.execSQL("INSERT INTO HIPOTECA(_id.'Bankia')"). Log.29 30 3: Crear tabla en SQLite Ahora que ya tenemos la clase controladora de la base de datos vamos implementar el método onCreate con la creación de la tabla HIPOTECA que consta de los siguientes campos:        _id: Identificador del registro.getClass().execSQL( "CREATE UNIQUE INDEX hip_nombre ON HIPOTECA(hip_nombre ASC)" ). db. Lo utilizaremos para incluir el nombre de la hipoteca o entidad bancaria. 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 @Override public void onCreate(SQLiteDatabase db) { Log." + " hip_observaciones TEXT)" ).i(this." + " hip_email TEXT. hip_condiciones: Condiciones bancarias de la hipoteca.toString()." + " hip_nombre TEXT NOT NULL. VALUES(4. hip_observaciones: Notas referentes a la hipoteca.execSQL("INSERT INTO HIPOTECA(_id. Es importante utilizar como identificador _id ya que los cursores que utilizaremos para recuperar la información dan por hecho que el identificador toma este nombre. Caixa')")." + " hip_telefono TEXT.toString().execSQL( "CREATE TABLE HIPOTECA(" + " _id INTEGER PRIMARY KEY. hip_contacto: Persona con la que estamos en contacto con la entidad bancaria hip_email: E-mail de contacto.'Cajamar')"). "Creando base de datos").getClass(). db.'Santander')"). " + " hip_condiciones TEXT. db.execSQL("INSERT INTO HIPOTECA(_id. hip_nombre) hip_nombre) hip_nombre) VALUES(3.

Toast. "Base de datos preparada". Para ello modificamos el método onCreate de la clase de la actividad principal de la aplicación.i(this.execSQL("INSERT INTO HIPOTECA(_id. setContentView(R. Hipoteca. db.28 29 30 31 32 33 db. hip_nombre) VALUES(6.LENGTH_LONG).java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 @Override protected void onCreate(Bundle savedInstanceState) { super. SQLiteDatabase db = dbHelper. hip_nombre) VALUES(7.getWritableDatabase().'Banco Sabadell')").show().makeText(getBaseContext().'Banco Popular')").activity_hipoteca).toString(). "Datos iniciales HIPOTECA insertados").i(this. } 5: Ejecución de la aplicación ¡Ya está todo listo! Ahora basta con ejecutar la aplicación en el emulador teniendo en cuenta que se mostrará un mensaje emergente cuando la base de datos esté preparada. /* * Declaramos el controlador de la BBDD y accedemos en modo escritura */ HipotecaDbHelper dbHelper = new HipotecaDbHelper(getBaseContext()).toString(). La primera vez desencadena la ejecución del método onCreate de nuestra clase HipotecaDbHelper. "Base de datos creada"). } 4: Abrir la base de datos SQLite desde la aplicación Android Al iniciar nuestra aplicación abrimos la base de datos. .onCreate(savedInstanceState).layout. Toast.execSQL("INSERT INTO HIPOTECA(_id. Log. Log.getClass().getClass().

. la primera vez que se ejecute la aplicación veremos como indica los pasos seguidos en la creación de la base de datos.Además si revisamos el LogCat.

content. 1 2 3 4 5 6 7 8 9 10 11 12 13 package com.hipotecas.Tutorial CRUD Android + SQLite (II): Mostrar datos en ListView 03/29/2013 15:37 ⋅ 6 Comentarios ⋅ pmon En la entrada anterior vimos la definición y creación de la base de datos SQLite para la aplicación CRUD de ejemplo que consistía en registrar las condiciones ofrecidas por las entidades bancarias para la solicitud de una hipoteca.database. android.database. android.database.SQLiteDatabase. 1: HipotecaDbAdapter Definimos la clase HipotecaDbAdapter para gestionar las operaciones de la entidad HIPOTECA en la base de datos SQLite.sodenet.Cursor. public class HipotecaDbAdapter { /** * Definimos constante con el nombre de la tabla */ public static final String C_TABLA = "HIPOTECA" . En la entrada actual trataremos la visualización de los registros de la base de datos SQLite en un componente ListView.sqlite. /** .SQLException. android. import import import import android.Context.

nu return c. null. } public void cerrar() { dbHelper. columnas. null.close(). db = dbHelper.query( true.contexto = context. private HipotecaDbHelper dbHelper. } public HipotecaDbAdapter abrir() throws SQLException { dbHelper = new HipotecaDbHelper(contexto). C_COLUMNA_OBSERVACIONES = "hip_observaciones". C_TABLA.getWritableDatabase().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 56 57 58 59 60 * Definimos */ public static public static public static public static public static public static public static constantes con el nombre de las columnas de la tabla final final final final final final final String String String String String String String C_COLUMNA_ID = "_id". C_COLUMN C_COLUMNA_OBSERVACIONES} . C_COLUMNA_NOMBRE. C_COLUMNA_CONDICIONES = "hip_condiciones". } /** * Devuelve cursor con todos las columnas de la tabla */ public Cursor getCursor() throws SQLException { Cursor c = db. C_COLUMNA_NOMBRE = "hip_nombre". } } . /** * Definimos lista de columnas de la tabla para utilizarla en las consultas a la */ private String[] columnas = new String[]{ C_COLUMNA_ID. C_COLUMNA_CONTACTO = "hip_contacto". return this. private Context contexto. public HipotecaDbAdapter(Context context) { this. null. C_COLUMNA_EMAIL = "hip_email". C_COLUMNA_TELEFONO = "hip_telefono". null. null. private SQLiteDatabase db.

view. 7 import android.view. 1 package com.widget.view.widget. Cursor cursor) 21 { .database.CursorAdapter. 16 dbAdapter = new HipotecaDbAdapter(context). dbAdapter. 8 9 public class HipotecaCursorAdapter extends CursorAdapter 10{ 11 12 private HipotecaDbAdapter dbAdapter = null . Cursor c) { 15 super(context. 13 14 public HipotecaCursorAdapter(Context context.View.Context. 5 import android. 4 import android. 17 } 18 19 20 @Override public void bindView(View view. 2 import android.TextView. 3 import android.LayoutInflater.hipotecas.sodenet. import android.61 2: HipotecaCursorAdapter Definimos la clase HipotecaCursorAdapter que utilizaremos desde la Activity Hipoteca para alimentar el ListView con los datos obtenidos a traves de la clase HipotecaDbAdapter. c).ViewGroup.content. Context context. 6 import android.abrir().Cursor.

from(context). 22 23 tv. Cursor cursor. p 30false).inflate(android.R.xml dejándolo como sigue a continuación: 1 <LinearLayout . 33 } 34} 35 36 37 38 39 3: Diseño Layout Activity Principal En la entrada anterior creamos la Activity Hipoteca dejando el diseño de la misma en blanco.getString(cursor.layout. 31 32 return view.C_COLUMNA_NO 24 } 25 26 @Override 27 public View newView(Context context.getColumnIndex(HipotecaDbAdapter.simple_dropdown_item_1line.setText(cursor.TextView tv = (TextView) view . Ahora vamos a editar el layout de esta Activity posicionando un ListView que utilizaremos para mostrar los registros de la base de datos SQLite. 29 final View view = inflater. Editamos archivo res/layout/activity_hipoteca. ViewGroup parent) 28 { final LayoutInflater inflater = LayoutInflater.

En el método onCreate obtenemos la referencia a la ListView incluida en el layout y creamos y preparamos el adaptador dbAdapter para gestionar las operaciones sobre la entidad HIPOTECA en la base de datos SQLite. android. ya que simplificará el tratamiento de la lista en próximas modificaciones. import import import import import android.Bundle.Menu. El método consultar() se encargará de vincular el CursorAdapter hipotecaAdapter a la ListView lista.ListActivity. private HipotecaCursorAdapter hipotecaAdapter .view.app. android. 1 2 3 4 5 6 7 8 9 10 11 12 package com. android.com/apk/res/android" xmlns:tools="http://schemas.widget.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".Cursor.ListView. .2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 1 xmlns:android="http://schemas.Hipoteca" > <ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="wrap_content"/> <TextView android:id="@id/android:empty" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/lista_vacia" /> </LinearLayout> Añadimos al archivo res/values/strings.os. android.android. private Cursor cursor. public class Hipoteca extends ListActivity { private HipotecaDbAdapter dbAdapter.database.sodenet.xml la definición de string que utilizamos cuando la lista está vacía.android. <string name="lista_vacia">Sin Datos</string> 4: Enlazar ListActivity con la base de datos SQLite Modificamos la Activity principal de la aplicación para que herede de ListActivity. private ListView lista.hipotecas.

setContentView(R. lista.hipoteca.getCursor(). this adds items to the action bar if it is present.layout.R. } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu.id.onCreate(savedInstanceState).list).activity_hipoteca). dbAdapter = new HipotecaDbAdapter(this). . menu).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 @Override protected void onCreate(Bundle savedInstanceState) { super. hipotecaAdapter = new HipotecaCursorAdapter(this. lista = (ListView) findViewById(android.inflate(R. dbAdapter. return true. getMenuInflater(). } } 5: Ejecución de la aplicación ¡Ya está todo listo! Ahora basta con ejecutar la aplicación en el emulador. } private void consultar() { cursor = dbAdapter. cursor). consultar().menu. startManagingCursor(cursor).abrir().setAdapter(hipotecaAdapter).

.

HipotecaFormulario" > 5 <RelativeLayout 6 android:layout_width="wrap_content" 7 android:layout_height="wrap_content" 8 android:orientation="vertical" 9 android:padding="10dp" > 10 .com/tools" 2 android:layout_width="match_parent" 3 android:layout_height="match_parent" 4 tools:context=".xml dejándolo como sigue a continuación: 1 <ScrollView xmlns:android="http://schemas.com/apk/res/android" xmlns:tools="http://schemas. Editamos archivo res/layout/activity_hipoteca_formulario.android.android.Tutorial CRUD Android + SQLite (III): Mostrar datos en Formulario 04/06/2013 18:29 ⋅ 2 Comentarios ⋅ pmon En la entrada anterior vimos cómo mostrar en un listview registros de la base de datos SQLitepara la aplicación CRUD de condiciones para la solicitud de una hipoteca. En la entrada actual mostraremos los registros de forma individual en un formulario profundizando en los siguientes conceptos:    Evento onListItemClick en ListView al seleccionar un registro Navegar entre Actividades pasando datos con Intent putExtra Consultar un registro de SQLite en Formulario 1: Diseño Layout Formulario Creamos una nueva actividad HipotecaFormulario con diseño de formulario para mostrar los datos de cada registro en la tabla HIPOTECA de SQLite.

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 56 57 <TextView android:id="@+id/label_nombre" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/label_nombre_hipoteca" android:textAppearance="?android:attr/textAppearanceMedium" <EditText android:id="@+id/nombre" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/label_nombre" android:ems="10" /> <TextView android:id="@+id/label_condiciones" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/label_condiciones" android:textAppearance="?android:attr/textAppearanceMedium" android:layout_below="@+id/nombre" android:layout_marginTop="20dp" /> <EditText android:id="@+id/condiciones" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/label_condiciones" android:ems="10" android:inputType="textMultiLine"> </EditText> <TextView android:id="@+id/label_contacto" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/label_contacto" android:textAppearance="?android:attr/textAppearanceMedium" android:layout_below="@+id/condiciones" android:layout_marginTop="20dp" /> <EditText android:id="@+id/contacto" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/label_contacto" android:ems="10"> </EditText> <TextView android:id="@+id/label_telefono" .

58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 /> 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/label_telefono" android:textAppearance="?android:attr/textAppearanceMedium" android:layout_below="@+id/contacto" android:layout_marginTop="20dp" /> <EditText android:id="@+id/telefono" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/label_telefono" android:ems="10" android:inputType="phone" > </EditText> <TextView android:id="@+id/label_email" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/telefono" android:layout_marginTop="20dp" android:text="@string/label_email" android:textAppearance="?android:attr/textAppearanceMedium" <EditText android:id="@+id/email" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/label_email" android:ems="10" android:inputType="textEmailAddress"/> <TextView android:id="@+id/label_observaciones" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/label_observaciones" android:textAppearance="?android:attr/textAppearanceMedium" android:layout_below="@+id/email" android:layout_marginTop="20dp" /> <EditText android:id="@+id/observaciones" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/label_observaciones" android:ems="10" android:inputType="textMultiLine"> </EditText> .

xml 1 2 3 4 5 6 <string <string <string <string <string <string name="label_nombre_hipoteca">Nombre:</string> name="label_condiciones">Condiciones:</string> name="label_contacto">Contacto:</string> name="label_telefono">Teléfono:</string> name="label_email">E-Mail:</string> name="label_observaciones">Observaciones:</string> Diseño de layout_hipoteca_formulario.xml .105 </RelativeLayout> 106</ScrollView> 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 Añadimos las etiquetas utilizadas en el formulario al archivo res/values/strings.

view. dbAdapter. Hipoteca. } . cursor).Intent. private ListView lista. lista = (ListView) findViewById(android.setAdapter(hipotecaAdapter).list).database.os. @Override protected void onCreate(Bundle savedInstanceState) { super. dbAdapter = new HipotecaDbAdapter(this).ListActivity.Este método declara el Intent necesario para iniciar la nueva actividad. android. private Cursor cursor.content. android. hipotecaAdapter = new HipotecaCursorAdapter(this.id. } private void consultar() { cursor = dbAdapter. android.getCursor(). En este Intent incluimos los parámetros modo de comportamiento e identificador del registro seleccionado.activity_hipoteca).2: Navegar a Activity Formulario desde la Activity principal A continuación enlazamos la selección de cada uno de los registros de la lista de hipotecas con el formulario.layout. Para ello utilizaremos el evento onListItemClick de la ListActivity Hipoteca. setContentView(R. consultar().Bundle. que llama al método visualizar.abrir().Menu.sodenet. startManagingCursor(cursor).app.onCreate(savedInstanceState). lista.view.widget. android.ListView. android. android. public static final int C_VISUALIZAR = 551 .View. import import import import import import import android.Cursor.R. private HipotecaDbAdapter dbAdapter. public class Hipoteca extends ListActivity { public static final String C_MODO = "modo" .java 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 package com. private HipotecaCursorAdapter hipotecaAdapter .hipotecas.

inflate(R.SQLException.menu.database. para obtener el registro de la base de datos SQLite incluiremos el nuevo método getRegistro en la clase HipotecaCursorAdapter.hipoteca.this. getMenuInflater(). i. long id) { super.Context. } } 3: Consultar un Registro de SQLite Desde la actividad Formulario recibiremos el identificador del registro que debe mostrarse. int position. position. this adds items to the action bar if it is present. return true. View v. } private void visualizar(long id) { // Llamamos a la Actividad HipotecaFormulario indicando el modo visualización identificador del registro Intent i = new Intent(Hipoteca.36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu. android.content. HipotecaFormulario. C_VISUALIZAR). id). visualizar(id).sodenet.hipotecas.onListItemClick(l.SQLiteDatabase. id).C_COLUMNA_ID. C_VISUALIZAR). menu).sqlite. v. i.putExtra(C_MODO. android. android.database.Cursor.class). startActivityForResult(i.putExtra(HipotecaDbAdapter. 1 2 3 4 5 6 7 8 package com.database. } @Override protected void onListItemClick(ListView l. public class HipotecaDbAdapter { . import import import import android.java.

contexto = context. /** * Definimos */ public static public static public static public static public static public static public static constantes con el nombre de las columnas de la tabla final final final final final final final String String String String String String String C_COLUMNA_ID = "_id". null. /** * Definimos lista de columnas de la tabla para utilizarla en las consultas a la */ private String[] columnas = new String[]{ C_COLUMNA_ID. null. nu return c. } /** * Devuelve cursor con todos las columnas del registro . C_TABLA. null. private HipotecaDbHelper dbHelper. private Context contexto.close(). C_COLUMNA_CONDICIONES = "hip_condiciones".query( true. C_COLUMNA_NOMBRE. null. return this. C_COLUMNA_OBSERVACIONES = "hip_observaciones". C_COLUMN C_COLUMNA_OBSERVACIONES} . C_COLUMNA_CONTACTO = "hip_contacto".getWritableDatabase(). C_COLUMNA_EMAIL = "hip_email". columnas. C_COLUMNA_NOMBRE = "hip_nombre". C_COLUMNA_TELEFONO = "hip_telefono". } public HipotecaDbAdapter abrir() throws SQLException { dbHelper = new HipotecaDbHelper(contexto).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 /** * Definimos constante con el nombre de la tabla */ public static final String C_TABLA = "HIPOTECA" . } public void cerrar() { dbHelper. private SQLiteDatabase db. public HipotecaDbAdapter(Context context) { this. db = dbHelper. null. } /** * Devuelve cursor con todos los registros y columnas de la tabla */ public Cursor getCursor() throws SQLException { Cursor c = db.

Intent.sodenet.java como se detalla a continuación:     El método onCreate obtiene los datos que hemos pasado desde la Actividad principal Preparamos el adaptador de base de datos que utilizaremos para consultar el registro Obtenemos el registro de la base de datos y rellenamos los campos del formulario Como hemos llamado al formulario en modo Visualización.hipotecas.app.query( true. android. } } 4: Mostrar registro en Activity Formulario Una vez tenemos preparado el acceso desde la actividad principal al formulario y el adaptador para obtener el registro de la base de datos SQLite.Bundle.56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 */ public Cursor getRegistro(long id) throws SQLException { Cursor c = db.Cursor. import import import import import android. C_TABLA. } return c. public class HipotecaFormulario extends Activity { private HipotecaDbAdapter dbAdapter. null. columnas. // // Modo del formulario . desactivamos la edición de los campos 1 2 3 4 5 6 7 8 9 10 11 12 13 package com. modificamos la clase del formulario HipotecaFormulario.content.moveToFirst(). android.Activity. n //Nos movemos al primer registro de la consulta if (c != null) { c.EditText.os.database. android.widget. C_COLUMNA_ID + "=" + id. private Cursor cursor. android.

Bundle extra = intent. // // Obtenemos el identificador del registro si viene indicado // if (extra. setContentView(R. } // // Establecemos el modo del formulario .C_COLUMNA_ID). email.id. @Override protected void onCreate(Bundle savedInstanceState) { super. // // Obtenemos los elementos de la vista // nombre = (EditText) findViewById(R. contacto. condiciones = (EditText) findViewById(R. // // Creamos el adaptador // dbAdapter = new HipotecaDbAdapter(this).C_COLUMNA_ID)) { id = extra.contacto). telefono = (EditText) findViewById(R.observaciones). contacto = (EditText) findViewById(R. if (extra == null) return. condiciones. telefono.nombre).getExtras().telefono).id. Intent intent = getIntent().layout. // // Elementos de // private EditText private EditText private EditText private EditText private EditText private EditText la vista nombre.condiciones). consultar(id). // // Identificador del registro que se edita cuando la opción es MODIFICAR // private long id .id. observaciones.id.email).abrir(). email = (EditText) findViewById(R. dbAdapter.getLong(HipotecaDbAdapter.onCreate(savedInstanceState).containsKey(HipotecaDbAdapter.id.activity_hipoteca_formulario).id. observaciones = (EditText) findViewById(R.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 56 57 58 59 60 // private int modo .

getColumnIndex(HipotecaDbAdapter.setEnabled(opcion).setEnabled(opcion).getColumnIndex(HipotecaDbAdapter. } } private void consultar(long id) { // // Consultamos el centro por el identificador // cursor = dbAdapter.modo = m .getColumnIndex(HipotecaDbAdapter. condiciones.C_COLUM condiciones.61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 } 96 97 98 99 100 101 102 103 104 105 106 107 // establecerModo(extra. contacto. if (modo == Hipoteca.getString(cursor. email.C_ contacto.setText(cursor.C_COL email.setText(cursor. } .setEnabled(opcion).toString()). } private void establecerModo(int m) { this.getColumnIndex(HipotecaDbAdapter.getInt(Hipoteca.C_MODO)).getString(cursor.getColumnIndex(HipotecaDbAdapter.C_COL telefono.setEnabled(opcion).setTitle(nombre. } private void setEdicion(boolean opcion) { nombre.C_COLUMN observaciones.getString(cursor.setText(cursor. observaciones. telefono.getText().getString(cursor.C_VISUALIZAR) { this.setText(cursor.getString(cursor.setEnabled(opcion).setEnabled(opcion). this.setEdicion(false).setText(cursor.getRegistro(id).getString(cursor.setText(cursor.getColumnIndex(HipotecaDbAdapter. nombre.

Modificamos la versión de la base de datos de 1 a 2 y en el método onUpgrade hacemos un UPDATE rellenando la información. Por tanto.com'. Entraremos en detalle sobre esta cuestión en entradas posteriores.execSQL("UPDATE HIPOTECA SET hip_contacto = 'Julián Gómez Martínez'. int newVersion) { if (newVersion == 2) { db. . int oldVersion." + " hip_email = 'jgmartinez@gmail. 1 2 3 4 5 6 7 8 9 10 11 12 @Override public void onUpgrade(SQLiteDatabase db.108 109 110 111 5: Ejecución de la aplicación Por el momento no tenemos posibilidad de editar los registros de nuestra tabla Hipotecas y todos los registros creados por defecto tienen únicamente el identificador y el nombre.java. } } ¡Ya está todo listo! Ahora basta con ejecutar la aplicación en el emulador. Esto lo haremos desde el archivo HipotecaDbHelper. para mostrar una información más completa en el formulario vamos a ampliar el contenido de registro con identificador 1." + " hip_observaciones = 'Tiene toda la documentación y informar de las condiciones'" + " WHERE _id = 1").

.

.xml para incluir la opción para crear nuevo registro.. public static final int C_CREAR = 552 . . 1 2 3 4 5 6 7 1 <menu xmlns:android="http://schemas. <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. 1 2 3 4 5 6 7 8 9 public class Hipoteca extends ListActivity { public static final String C_MODO = "modo" .. Definimos el método onMenuItemSelected de Hipoteca.java para realizar la llamada a la actividad formulario.Tutorial CRUD Android + SQLite (IV): Insertar datos desde Formulario 04/16/2013 21:24 ⋅ 2 Comentarios ⋅ pmon En la entrada anterior vimos cómo mostrar registros de la base de datos SQLite en un formulario. public static final int C_VISUALIZAR = 551 .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. .. en esta nos centraremos en cómo insertar registros en una base de datos SQLite desde un formulario .xml.android.. 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. 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.

item).putExtra(C_MODO. null.insert(C_TABLA.getItemId()) { case R. switch (item.id.onMenuItemSelected(featureId. 1 2 3 4 5 6 7 8 <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 . C_CREAR). MenuItem item) { Intent i. i. HipotecaFormulario.class). reg).java el método que utilizaremos para insertar los datos que enviaremos desde el formulario. C_CREAR). 1 2 3 4 5 6 7 8 9 10 /** * Inserta los valores en un registro de la tabla */ public long insert(ContentValues reg) { if (db == null) abrir(). } return super. } Modificamos el diseño del formulario res/layout/activity_hipoteca_formulario.xml para incluir al final una botonera para Guardar y Cancelar.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 @Override public boolean onMenuItemSelected(int featureId.menu_crear: i = new Intent(Hipoteca. startActivityForResult(i. return true. } 2: Insertar registro en SQLite desde Formulario Comenzamos añadiendo a la clase HipotecaDbAdapter. return db.this.

Toast.Cursor. android.EditText. android. android.9 10 11 12 13 14 15 16 17 18 19 20 21 22     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.Activity.view. android. public class HipotecaFormulario extends Activity { private HipotecaDbAdapter dbAdapter.widget.Button. android. android.hipotecas.sodenet.content.widget. // // Identificador del registro que se edita cuando la opción es MODIFICAR // private long id .Intent. // // Elementos de la vista // .ContentValues. // // Modo del formulario // private int modo .widget.content.os. android.app.View.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 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 package com. private Cursor cursor.database. import import import import import import import import import android. android.Bundle.

id.email). // // Obtenemos el identificador del registro si viene indicado // if (extra.id.getInt(Hipoteca.id. dbAdapter.boton_guardar). telefono. // // Creamos el adaptador // dbAdapter = new HipotecaDbAdapter(this). boton_guardar = (Button) findViewById(R. @Override protected void onCreate(Bundle savedInstanceState) { super.boton_cancelar).contacto).C_COLUMNA_ID). contacto = (EditText) findViewById(R. consultar(id).getExtras().id. email = (EditText) findViewById(R. private Button boton_cancelar. telefono = (EditText) findViewById(R.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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 private private private private private private EditText EditText EditText EditText EditText EditText nombre. if (extra == null) return.id. contacto.getLong(HipotecaDbAdapter. observaciones. // // Obtenemos los elementos de la vista // nombre = (EditText) findViewById(R. } // // Establecemos el modo del formulario // establecerModo(extra.observaciones).abrir(). boton_cancelar = (Button) findViewById(R. setContentView(R.condiciones). private Button boton_guardar.id. Bundle extra = intent.onCreate(savedInstanceState).containsKey(HipotecaDbAdapter. // . email. condiciones = (EditText) findViewById(R.C_COLUMNA_ID)) { id = extra.nombre).id. observaciones = (EditText) findViewById(R.telefono).layout.activity_hipoteca_formulario).id. Intent intent = getIntent(). condiciones.C_MODO)).

boton_cancelar.getRegistro(id).C_CREAR) { this. if (modo == Hipoteca.getString(cursor.setTitle(R.setText(cursor.getString(cursor. } private void establecerModo(int m) { this.C_COLUMN observaciones.C_VISUALIZAR) { this.C_ contacto.getColumnIndex(HipotecaDbAdapter.C_COLUM condiciones.getString(cursor. } }).getString(cursor.string.hipoteca_crear_titulo).setEdicion(false). this.getColumnIndex(HipotecaDbAdapter.C_COL telefono.getColumnIndex(HipotecaDbAdapter.getText(). nombre. } .C_COL email.modo = m . } else if (modo == Hipoteca.setText(cursor.OnClickListener() { @Override public void onClick(View v) { cancelar().OnClickListener() { @Override public void onClick(View v) { guardar().73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 // Definimos las acciones para los dos botones // boton_guardar.toString()).setOnClickListener(new View.setText(cursor.setText(cursor.getColumnIndex(HipotecaDbAdapter.setText(cursor.setOnClickListener(new View.getColumnIndex(HipotecaDbAdapter.getColumnIndex(HipotecaDbAdapter.setTitle(nombre. } }).setEdicion(true). } } private void consultar(long id) { // // Consultamos el centro por el identificador // cursor = dbAdapter.getString(cursor.getString(cursor.setText(cursor. this.

138 reg.put(HipotecaDbAdapter.setEnabled(opcion).put(HipotecaDbAdapter.toString()). contacto.string.C_COLUMNA_CONDICIONES.C_COLUMNA_TELEFONO. R.getText().getText(). 155 } 156} 157 158 159 160 161 162 163 164 165 166 .LENGTH_SHORT).this. 133 134 reg. 135 reg.setEnabled(opcion).C_COLUMNA_OBSERVACIONES. telefono.insert(reg). 136 reg.C_COLUMNA_NOMBRE.show().put(HipotecaDbAdapter.getText().toString reg. nombre.toString()).C_COLUMNA_CONTACTO.toString()). condiciones.120 private void setEdicion(boolean opcion) 121 { nombre. 123 contacto. 137 reg. 149 finish().put(HipotecaDbAdapter. 125 126 } observaciones.C_COLUMNA_EMAIL.toSt 139 140 if (modo == Hipoteca.makeText(HipotecaFormulario. email.C_CREAR) { 141 dbAdapter.getText(). 142 Toast. 122 condiciones.toString()).setEnabled(opcion). 144 } 145 146 // // Devolvemos el control 147 // 148 setResult(RESULT_OK). 124 email.setEnabled(opcion). observaciones.getText(). 150 } 151 152 private void cancelar() 153 { setResult(RESULT_CANCELED.getText().put(HipotecaDbAdapter. 127 128 private void guardar() 129 { // 130 // Obtenemos los datos del formulario 131 // 132 ContentValues reg = new ContentValues().setEnabled(opcion). telefono.hipoteca_crear_confirmacion 143 Toast. 154 finish().setEnabled(opcion).put(HipotecaDbAdapter. null).

También definimos el texto que se mostrará en el formulario en modo creación. } } . int resultCode.onActivityResult(requestCode. Intent data) { // // Nos aseguramos que es la petición que hemos realizado // switch(requestCode) { case C_CREAR: if (resultCode == RESULT_OK) consultar().xml. resultCode.167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 Desde el método guardar se lanza un mensaje informativo que debemos registrar en res/values/strings. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 @Override protected void onActivityResult(int requestCode.java el métodoonActivityResult. data). Para ello. definimos en Hipoteca. 1 2 <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. default: super.

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

com/apk/res/android" > <item android:id="@+id/menu_eliminar" android:title="@string/menu_eliminar" /> </menu> src/Hipoteca. en esta nos centraremos en cómo eliminar registros en una base de datos SQLite desde un formulario .xml 1 2 3 4 5 6 7 8 <menu xmlns:android="http://schemas.Tutorial CRUD Android + SQLite (V): Eliminar registros desde formulario 04/28/2013 12:35 ⋅ 3 Comentarios ⋅ pmon En la entrada anterior vimos cómo insertar registros de la base de datos SQLite desde un formulario.xml y tendrá las opciones guardar y cancelar. Por ello definiremos dos menús y cargaremos en onPrepareOptionsMenu el que corresponda. 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. El menú el formulario en modo visualización lo definiremos enres/menu/hipoteca_formulario_ver.android.java res/menu/hipoteca_formulario_editar.xml 1 2 3 4 5 6 7 <menu xmlns:android="http://schemas.xml y tendrá la opción eliminar mientras que el menú para el modo inserción lo llamaremos res/menu/hipoteca_formulario_editar. res/menu/hipoteca_formulario_ver. Lo llamamos editar porque reutilizaremos el menú para añadir nuevas opciones en próximos entradas.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" /> .android.

3: Definir acciones del menú en el método onMenuItemSelected .java 1 2 3 <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.inflate(R. 1 .. 17. 13 14 return true. 9 menu). src/Hipoteca.menu..9 10 11 </menu> Incluimos las nuevas cadenas en el fichero res/values/strings..C_VISUALIZAR) 8 getMenuInflater(). Para ello modificamossrc/HipotecaFormulario. 6 7 if (modo == Hipoteca..inflate(R. @Override 3 public boolean onCreateOptionsMenu(Menu menu) { 4 5 menu.clear(). 10 else 11 getMenuInflater().hipoteca_formulario_editar. 2 . 15 } 16..menu. dependiendo de la acción del formulario cargaremos el menú correspondiente en el método onPrepareOptionsMenu..java añadiendo lo que sigue a continuación.hipoteca_formulario_ver. 12menu).xml...

Para ello modificamossrc/HipotecaFormulario... } @Override public boolean onMenuItemSelected(int featureId. } . } return super. case R. return true.id.En el método onMenuItemSelected capturaremos la opción pulsada del menú y realizaremos la acción que corresponda en cada caso.getItemId()) { case R.menu_guardar: guardar(). ..java añadiendo lo que sigue a continuación.menu_cancelar: cancelar(). entre ellas la nueva acción borrar. MenuItem item) { switch (item.onMenuItemSelected(featureId.getItemId()) { case R. @Override public boolean onMenuItemSelected(int featureId. return true. item).id. MenuItem item) { switch (item.. case R. return true. } return super.id. case R. 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 .menu_cancelar: cancelar().. .. return true.id. return true.id. item)..menu_guardar: guardar(). case R.menu_eliminar: borrar(id). .menu_eliminar: borrar(id).onMenuItemSelected(featureId. return true..id.

dialogEliminar.44 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.show(). Incluimos las nuevas cadenas en el fichero res/values/strings. . dialogEliminar..Builder dialogEliminar = new AlertDialog.setPositiveButton(getResources(). int boton) { dbAdapter. dialogEliminar.string. .setIcon(android. finish().hipoteca_eliminar_confi Toast.ok) DialogInterface. 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 ..ic_dialog_alert). } .java añadiendo lo que sigue a continuación. . /** * Devolvemos el control */ setResult(RESULT_OK).getString(R.setMessage(getResources().hipoteca_eliminar_ dialogEliminar.hipoteca_eliminar_ti dialogEliminar.. null).makeText(HipotecaFormulario. private void borrar(final long id) { /** * Borramos el registro con confirmación */ AlertDialog.setNegativeButton(android.string.OnClickListener() { public void onClick(DialogInterface dialog. Para ello modificamos src/HipotecaFormulario. R.delete(id). dialogEliminar. } })..xml.string.LENGTH_SHORT)..R.getString(R..setTitle(getResources().R. dialogEliminar.R..getString(android.setCancelable(false).this.string.show().no..string.Builder(this).drawable. Toast.

. Modificaremos el método onActivityResult de la actividadsrc/Hipoteca. "_id=" + id. null). Intent data) { // // Nos aseguramos que es la petición que hemos realizado // switch(requestCode) { case C_CREAR: if (resultCode == RESULT_OK) consultar().. .. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 5: Refrescar el ListView de la actividad principal Como hemos visto anteriormente.java .. return db. case C_VISUALIZAR: if (resultCode == RESULT_OK) consultar().. } . @Override protected void onActivityResult(int requestCode. /** * Eliminar el registro con el identificador indicado */ public long delete(long id) { if (db == null) abrir().delete(C_TABLA.. al borrar el registro se devuelve el control a la actividad principal con el método setResult.java para refrescar la información de la lista cuando volvamos del formulario en modo Visualización.1 2 3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <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... .. int resultCode... .

} } .. data). .... .17 18 19 20 21 22 23 24 default: super.onActivityResult(requestCode. resultCode. 6: Ejecución de la aplicación ¡Ya está todo listo! Ahora basta con ejecutar la aplicación en el emulador.