Aprende Android

Vaya al Contenido

Menu Principal

Almacenamiento de datos (3ª parte)

Almacenando datos

Cómo poder listar todas las tareas

Vamos a ver cómo se puede generar un listado de todas las tareas de la base de datos en el ListView con el ReminderListActivity.

Vamos a poner a continuación, todo el archivo ReminderListActivity, con el código para leer la lista de tareas de la base de datos y mostrarla en el ListView:

1    package es.greval.taskReminder;
2
3   import android.app.ListActivity;
4   import android.content.Intent;
5   import android.database.Cursor;
6   import android.os.Bundle;
7   import android.view.MenuItem;
8   import android.view.View;
9   import android.widget.AdapterView.AdapterContextMenuInfo;
10  import android.widget.ListView;
11  import android.widget.SimpleCursorAdapter;
12
13  public class ReminderListActivity extends ListActivity {
14    private static final int ACTIVITY_CREATE=0;
15    private static final int ACTIVITY_EDIT=1;
16    
17    private RemindersDbAdapter mDbHelper;
18    
19    //Se llama cuando la actividad se crea por primera vez
20    @Override
21    public void onCreate(Bundle savedInstanceState){
22        super.onCreate(savedInstanceState);
23        setContentView(R.layout.reminder_list);
24        mDbHelper=new RemindersDbAdapter(this);
25        mDbHelper.open();
26        fillData();
27        registerForContextMenu(getListView());
28    }
29    
30    private void fillData(){
31          Cursor remindersCursor=mDbHelper.ferchAllReminders();
32          startManagingCursor(remindersCursor);
33          
34          /** Crea una matriz para especificar los campos que
35          queremos (solo el Título)*/
36          String[] from = new String[]{RemindersDbAdapter.KEY_TITLE};
37          
38          // y un array y los campos que se desea enlazar en la view
39          int[] to = new int[]{R.id.text1};
40
41          // Se crea un adaptador de cursor y se establece en la pantalla
42          SimpleCursorAdapter reminders = new SimpleCursorAdapter(this,
43                      R.layout.reminder_row, remindersCursor, from, to);
44          setListAdapter(reminders);
45    }
46    
47    // Aquí va el código del menú
48    
49    @Override
50    protected void onListItemClick(ListView l, View v, int position,
51                long id) {
52          super.onListItemClick(l, v, position, id);
53          Intent i = new Intent(this, ReminderEditActivity.class);
54          i.putExtra(RemindersDbAdapter.KEY_ROWID, id);
55          startActivityForResult(i, ACTIVITY_EDIT);
56    }
57
58    @Override
59    protected void onActivityResult(int requestCode, int resultCode,
60                Intent intent) {
61          super.onActivityResult(requestCode, resultCode, intent);
62          fillData();
63    }
64    @Override
65    public boolean onContextItemSelected(MenuItem item) {
66          switch(item.getItemId()) {
67                case R.id.menu_delete:
68                      AdapterContextMenuInfo info =
69                           (AdapterContextMenuInfo)
70                           item.getMenuInfo();
71                      mDbHelper.deleteReminder(info.id);
72                      fillData();
73                      return true;
74          }
75          return super.onContextItemSelected(item);
76    }
77 }

Este código lo intentaré explicar a continuación:

En la 26 el método fillData() es llamado y carga los datos de la base de datos de SQLite en el ListView.
En la 31, ya dentro del método fillData(), se extraen todas las tareas de la base de datos.
En esta línea (32) se utiliza el método StartManagingCursor() que está presente en la clase de la Activity. Este método permite medir la actividad, de cuidar la gestión del ciclo de vida del Cursor sobre la base de la actividad. Por ejemplo, cuando la actividad se detiene, automáticamente llama a deactivate() sobre el Cursor, y cuando se reinicia más tarde, llama a requery(). Cuando la actividad es destruida, gestiona el cierre de todos los Cursores automáticamente.
En la línea 36 se definen los criterios de selección para la consulta.
En la 39, se define el array y los campos que se desean enlazar en la vista. Por ello, cuando se muestra el título de una tarea, corresponderá con una tarea en particular (ID).
En la línea 43 se crea un SimpleCursorAdapter que asigna las columnas de un Cursor al TextViews, tal como se define en un esquema del archivo “.xml”. Utilizando este método se puede especificar las columnas que se desean mostrar y el archivo “.xml” define el aspecto de las views.
En la 54 se coloca el ID de la tarea que se va a editar en el intent. El ReminderEdirActivity inspecciona este intent, y si encuentra la ID, permite al usuario modificar la tarea.
Línea 62: El método fillData() se llama cuando la actividad retorna de otra actividad. Se llama aquí debido a que el usuario puede querer actualizar o añadir una nueva tarea. Llamar a este método asegura que la nueva tarea está presente en el listview.
En la 65, se define el método que controla el menú de contexto, de eventos que se producen cuando el usuario selecciona un elemento del menú después de una pulsación larga en la tarea de la lista.
En la 70, se utiliza el método getMenuInfo() del elemento que se ha hecho clic, para obtener una instancia de AdapterContextMenuInfo. Esta clase muestra los diferentes bits de información sobre el elemento del menú y del ítem sobre el que se había presionado.
En la línea de código 71, se llama al ReminderDbAdapter para eliminar la tarea cuyo identificador se recupera del AdapterContextMenuInfo. Este campo contiene el ID de la fina del listview. Este identificador es el rowId de la tarea en la base de datos.
Y por último, en la fila 72, después que se ha suprimido la tarea del sistema, se llama al método fillData() para modificar la lista de tareas. Con ello se consigue quitar de la lista de tareas de la base de datos, el elemento eliminado.

Vamos a examinar el SimpleCursorAdapter

En las líneas 42-43 del listado anterior, se creó un SimpleCursorAdapter, que une los datos a los que apunta el Cursor a un listview.

Para configurar un SimpleCursorAdapter, es necesario proporcionar los siguientes parámetros:

  • This: Context: El contexto en el que está asociado con el adaptador.

  • R.layout.reminder_row – layout: El layout del identificador del recurso que define el fichero que se usará para este ítem de la lista.

  • reminderCursor – c: El Cursor de la base de datos.

  • from –from: Un array de los nombres de la columna que se utilizan para enlazar los datos desde el cursor hasta el listview (se define en la línea 24).

  • to - - to: Un array de los ID de las vistas que debería mostrar la información de la columna del parámetro. Definido en la línea 27.


Llegados a este punto, si se inicia la aplicación, se tendría que ver una lista vacía de tareas. Para que esa lista empiece a tener elementos, hay que ir creándolos. Para ello, se presiona el menú y se selecciona el ítem del menú que permite agregar una nueva tarea. Luego podremos ver la lista con las tareas creadas. Estas tareas se leen desde la base de datos de SQLite.

Eliminando tareas

Eliminar una tarea es tan simple como presionar un momento un tema en el ReminderListActivity y seleccionar la acción de borrado, pero para eliminar de forma efectiva la tarea de la base de datos, se necesita usar el método delete() en el objeto de la base de datos SQLite. Este método es llamado en la línea 48 del archivo “RemindersDbAdapter.class”.

El único elemento que se necesita antes de eliminar la tarea de la base de datos es el ROWID de la tarea en la base de datos. Para obtenerlo, se debe utilizar el objeto AdapterContextMenuInfo. En la línea 56 del listado anterior, se llama al método fillData() para recargar las tareas de la pantalla. Ahora ya se puede crear, leer y eliminar la tarea. Lo único que queda es actualizar la tarea.

Vamos a actualizar la tarea

Lo hemos complicado un poco al utilizar la misma activity para la actualización y creación de la tarea; por ello, tenemos que discernir si vamos a crear o a modificar una tarea. Lo conseguimos utilizando los intent a la hora de iniciar la actividad.

Cuando nos encontramos en el ReminderListActivity, cuando tocamos un ítem (elemento), se inicia la siguiente actividad:

Intent i = new Intent(this, ReminderEdirActivity.class);
i.putExtra(RemindersDbAdapter.KEY_ROWID, id);
startActivityForResult(i, ACTIVITY_EDIT);


Este código informa a Android que inicie el ReminderEditActivity con el parámetro i, que contiene la fila de la tarea que se desea modificar. Caso de que la tarea esté creada, carga la tarea para su modificación en el formulario. Si la tarea no está creada, presenta al usuario un formulario vacío para que pueda introducir los datos de la nueva tarea.

¿Cómo queda el archivo ReminderEditActivity.class?

En el siguiente listado vamos a poner el código el archivo ReminderEditActivity, utilizado para la creación y/o modificación de una tarea:

(Para el próximo día, que espero que sea pronto. Ten un poquitin de paciencia, que estoy en ello)

__________________________________________
Para cualquier duda que tengas sobre este ejemplo, cómprate el libro del que estoy sacando los apuntes. Lo puedes encontrar en internet en esta dirección:

http://eu.dummies.com/store/product/Android-Application-Development-For-Dummies.productCd-047077018X.html

Regreso al contenido | Regreso al menu principal