Guia do desenvolvedor

Local Navigation

Recuperar dados de tabela

Para executar um consulta que retorne conjuntos de resultado (como uma instrução SELECT), você deve usar o método Statement.getCursor.

O Cursor é uma tabela temporária que segura o conjunto de resultado. Quando o Cursor é fechado, a tabela temporária é descartada.

A interface do Cursor fornece acesso somente-leitura ao cursor. Os cursores podem ser consultados como tabelas persistentes. As colunas do cursor podem ser consultadas por objetos de Coluna que são passados em consultas subsequentes.

A implementação padrão da interface Cursor não armazena nenhum dado e, portanto, fornece navegação unidirecional somente de encaminhamento. Uma tentativa navegar para uma linha antes que a linha atual resulte em um DatabaseException.

A classe BufferedCursor armazena os dados de cursor em memória e fornece acesso a dados bidirecional e aleatório, mas há limites na quantidade de dados que pode manipular. O cursor em buffer pode lançar um OutOfMemoryError se for usado com conjuntos de resultado muito grandes.

Por padrão, uma única linha é armazenada em buffer de cada vez. Quando o cursor passa pelo conjunto em buffer, um novo grupo de linhas é buscado automaticamente. Para melhorar o desempenho, você pode aumentar o tamanho do buffer para um valor maior que 1. Você pode usar o método Statement.setCursorBufferSize para especificar o número de linhas a ser armazenado em buffer ao mesmo tempo.

Há um limite de 1 MB de dados que podem ser armazenados em um cursor. Na maioria de casos, este limite é suficiente. Se você pretende exceder o limite, você pode usar múltiplas consultas para criar conjuntos de resultado menores. Você pode, por exemplo, especificar que colunas retornar em uma instrução SELECT. Se você exceder o limite, você deve verificar se setCursorBufferSize está definido alto demais.

Se uma fila que você está consultando contém blobs, você pode usar o método createBlobInputStream para criar um objeto InputStream que não tem um limite de tamanho. Quando você usa um objeto InputStream, seu conjunto de resultados não está limitado a 1 MB.

Se você acha que a recuperação de dados está lenta, considere a criação de um índice de cobertura. Um índice de cobertura inclui todas as colunas utilizadas na coluna.

Exemplo de código: Recuperação de dados de tabela

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();
        }          
    }
}
Próximo tópico: Uso de transações
Tópico anterior: Trabalhar com blobs

Estas informações foram úteis? Gostaríamos de receber seus comentários.