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();
}
}
}
Estas informações foram úteis? Gostaríamos de receber seus comentários.