Tutorial CRUD Android + SQLite (IX): Filtrar resultados SQlite

Posted by in Programación Android

Siguiendo con el Tutorial Android + SQLite en la entrada anterior vimos cómo actualizar la versión de la base de datos SQLite, en esta veremos cómo filtrar resultados de SQlite.

Inluiremos una PreferenceActivity con la que el usuario configurará si se deben visualizar los registros pasivos. Esta configuración se guardará como SharedPreferences para tenerla disponible en las próximas sesiones. Para ello profundizaremos en los siguientes conceptos:

  • Crear una PreferenceActivity
  • Recuperar la configuración guardada con SharedPreferences
  • Filtrar la consulta de datos en SQLite

 

1: Crear una PreferenceActivity

Creamos una nueva actividad llamada Configuracion que herede de PreferenceActivity. Esta actividad la utilizaremos para incluir los parámetros de configuración de la aplicación.

package com.sodenet.hipotecas;

import android.os.Bundle;
import android.preference.PreferenceActivity;

public class Configuracion extends PreferenceActivity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.configuracion);
    }
}

 

El contenido de la actividad de configuración lo definiremos mediante el fichero res/xml/configuracion.xml.
En este caso definimos una categoría de preferencias llamada Filtrado de datos con un CheckBoxPreference para ocultar los registros pasivos.
Los cambios realizados sobre esta actividad se guardarán como SharedPreferences que podremos recuperar en sesiones posteriores.

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

    <PreferenceCategory android:title="Filtrado de datos">
        <CheckBoxPreference
                android:title="Ocultar registros pasivos"
                android:key="ocultar_registros_pasivos"
                android:summary="Ocultar los registros marcados como pasivos"
                android:defaultValue="false"/>
    </PreferenceCategory>

</PreferenceScreen>

 

2: Visualizar la PreferenceActivity

Para visualizar la pantalla de configuración, incluiremos una nueva opción en el menú de la actividad principal.

Incluimos la opción en el menu hipoteca.xml

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

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

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

</menu>

 

Creamos el recurso de texto menu_preferencias

...
...
<string name="menu_preferencias">Configuración</string>
...
...

 

Definimos la acción en la actividad principal.

...
...
public static final String C_MODO  = "modo" ;
public static final int C_VISUALIZAR = 551 ;
public static final int C_CREAR = 552 ;
public static final int C_EDITAR = 553 ;
public static final int C_ELIMINAR = 554 ;
public static final int C_CONFIGURAR = 555 ;
...
...
@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;

        case R.id.menu_preferencias:
            i = new Intent(Hipoteca.this, Configuracion.class);
            startActivityForResult(i, C_CONFIGURAR);
            return true;
    }
    return super.onMenuItemSelected(featureId, item);
}
...
...

 

3: Obtener las SharedPreferences

La actividad de configuración guardará la selección del usuario como SharedPreferences. Crearemos el método getPreferences en la actividad principal que lea el valor definido para la clave ocultar_registros_pasivos y construya el filtro que almacenaremos en una nueva propiedad filtro de la clase.

...
...
private String filtro ;
...
...
private void getPreferencias()
{
    //
    // Recuperamos las preferencias
    //
    SharedPreferences preferencias = PreferenceManager.getDefaultSharedPreferences(this);

    if (preferencias.getBoolean("ocultar_registros_pasivos", false))
    {
        // si se ocultan registros pasivos filtramos solamente los que tengan el valor 'N'
        this.filtro = HipotecaDbAdapter.C_COLUMNA_PASIVO + " = 'N' " ;
    }
    else
    {
        // si no se ocultan registros pasivos no filtramos
        this.filtro = null ;
    }
}
...
...

 
Al método getPreferencias lo llamaremos en el método onCreate y en el onResultActivity.

..
..
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_hipoteca);

    getPreferencias();

    lista = (ListView) findViewById(android.R.id.list);
    
    dbAdapter = new HipotecaDbAdapter(this);
    dbAdapter.abrir();
    
    consultar();
    
    registerForContextMenu(this.getListView());
}
...
...
@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();

        case C_CONFIGURAR:
            // en la PreferenceActivity no hemos definido ningún resultado por lo que recargamos
            // siempre las preferencias
            getPreferencias();
            consultar();

        default:
            super.onActivityResult(requestCode, resultCode, data);
    }
}
..
..

 

4: Filtrar la consulta en SQLite

Por último modificamos la clase HipotecaDbAdapter para incluir el parámetro filtro en el método getCursor y pasarlo al realizar la consulta.

...
...
/**
 * Devuelve cursor con todos los registros y columnas de la tabla
 */
public Cursor getCursor(String filtro) throws SQLException
{
    Cursor c = db.query( true, C_TABLA, columnas, filtro, null, null, null, null, null);
    
    return c;
}
...
...

 
También modificamos el método consultar de la clase principal para incluir el parámetro filtro.

...
...
private void consultar()
{
    cursor = dbAdapter.getCursor(filtro);
    startManagingCursor(cursor);
    hipotecaAdapter = new HipotecaCursorAdapter(this, cursor);
    lista.setAdapter(hipotecaAdapter);
}
...
...

 

5: Ejecución de la aplicación

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

android_sqlite_filtrar_1


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