Guía de desarrollo

Local Navigation

Recuperación de datos de tabla

Para ejecutar una consulta que devuelva un conjunto de resultados (como una instrucción SELECT), debe utilizar el método Statement.getCursor.

El Cursor es una tabla temporal que conserva el conjunto de resultados. Cuando el Cursor está cerrado, la tabla temporal se descarta.

La interfaz Cursor proporciona acceso de sólo lectura al Cursor. En los cursores se pueden realizar consultas de la misma forma que en las tablas permanentes. Se puede hacer referencia a las columnas Cursor mediante los objetos Columna que se pasan a las siguientes consultas.

La implementación predeterminada de la interfaz Cursor no guarda ningún dato en caché, y de este modo ofrece una navegación unilateral sólo hacia delante. Si se intenta ir a una fila anterior a la fila actual el resultado es DatabaseException.

La clase BufferedCursor guarda los datos del cursor en la memoria caché y proporciona un acceso bidireccional y aleatorio a los datos, pero hay ciertos límites en cuanto a la cantidad de datos que puede administrar. El cursor almacenado en búfer puede emitir OutOfMemoryError si se utiliza con conjuntos de resultados muy grandes.

De forma predeterminada, las filas se almacenan en búfer de una en una. Cuando el cursor deja atrás el conjunto almacenado en búfer, se obtiene automáticamente una serie de filas nueva. Para mejorar el rendimiento, puede aumentar el tamaño del búfer a un valor superior a 1. Puede utilizar el método Statement.setCursorBufferSize para especificar el número de filas que se desea almacenar en búfer al mismo tiempo.

Hay un límite de 1 MB para el almacenamiento de los datos en búfer en un cursor. En la mayoría de los casos este límite es suficiente. Si cree que va a exceder el límite, puede utilizar varias consultas para crear conjuntos de resultados más pequeños. Puede, por ejemplo, especificar qué columnas desea devolver con la instrucción SELECT. Si excede el límite, debe comprobar si setCursorBufferSize es demasiado alto.

Si una fila en la que está realizando una consulta contiene BLOB, puede utilizar el método createBlobInputStream para crear un objeto InputStream sin límite de tamaño. Cuando utiliza un objeto InputStream, su conjunto de resultados no está limitado a 1 MB.

Si cree que la recuperación de datos es lenta, plantéese crear un índice "covering index". Un índice "covering index" incluye todas las columnas mencionadas en la consulta.

Ejemplo de código: recuperar datos de tabla

import net.rim.device.api.ui.*;
import net.rim.device.api.ui.component.*;
import net.rim.device.api.ui.container.*;
import net.rim.device.api.database.*;
import net.rim.device.api.io.*;
public class ReadData extends UiApplication
{
    public static void main(String[] args)
    {
        ReadData theApp = new ReadData();
        theApp.enterEventDispatcher();
    }
    public ReadData()
    {
        pushScreen(new ReadDataScreen());
    }   
}
class ReadDataScreen extends MainScreen
{
    Database d;
    public ReadDataScreen()
    {
        LabelField title = new LabelField("SQLite Read Table Data Sample",
                                           LabelField.ELLIPSIS | 
                                           LabelField.USE_ALL_WIDTH);
        setTitle(title);
        add(new RichTextField("Attempting to retrieve data from " + 
                              "MyTestDatabase.db on the SDCard."));
        try
        {
            URI myURI = URI.create("file:///SDCard/Databases/SQLite_Guide/" +
                                   "MyTestDatabase.db"); 
            d = DatabaseFactory.open(myURI);
            Statement st = d.createStatement("SELECT Name,Age FROM People");
            st.prepare();
            Cursor c = st.getCursor();
            Row r;
            int i = 0;
            while(c.next()) 
            {
                r = c.getRow();
                i++;
                add(new RichTextField(i + ". Name = " + r.getString(0) +
                                          " , " +
                                          "Age = " + r.getInteger(1)));
            }
            if (i==0)
            {
                add(new RichTextField("No data in the People table."));
            }
            st.close();
            d.close();
        }
        catch ( Exception e ) 
        {         
            System.out.println( e.getMessage() );
            e.printStackTrace();
        }          
    }
}
Tema siguiente: Uso de transacciones
Tema anterior: Trabajo con BLOB

¿Le ha resultado útil esta información? Envíenos sus comentarios.