Guida allo sviluppo

Local Navigation

Recupero dei dati della tabella

Per eseguire una query che restituisca insiemi di risultati (come ad esempio un'istruzione SELECT), è necessario utilizzare il metodo Statement.getCursor.

L'oggetto Cursor è una tabella temporanea che mantiene l'insieme di risultati. Quando l'oggetto Cursor è chiuso, la tabella temporanea viene ignorata.

L'interfaccia Cursor offre un accesso di sola lettura all'oggetto Cursor. I cursori possono essere oggetto di query, proprio come avviene per le tabelle permanenti. Le colonne Cursor possono essere prese come riferimento da parte degli oggetti Column che vengono passati nelle query successive.

L'implementazione predefinita dell'interfaccia Cursor non memorizza alcun dato nella cache; pertanto fornisce una navigazione unidirezionale, valida solo per l'inoltro. Un tentativo di accedere a una riga prima di quella corrente fornisce un risultato del tipo DatabaseException.

La classe BufferedCursor memorizza nella cache i dati del cursore presenti in memoria e fornisce un accesso ai dati bidirezionale e casuale, ma esistono dei limiti sulla quantità di dati che è in grado di gestire. Il cursore del buffer potrebbe generare un OutOfMemoryError se viene utilizzato con insiemi di risultati di grandi dimensioni.

Per impostazione predefinita, viene memorizzata nel buffer una riga alla volta. Quando il cursore si sposta oltre l'insieme di dati nel buffer, viene automaticamente recuperato un nuovo batch di righe. Per migliorare le prestazioni, potrebbe essere opportuno aumentare le dimensioni del buffer a un valore maggiore di 1. È possibile utilizzare il metodo Statement.setCursorBufferSize per specificare il numero di righe da memorizzare contemporaneamente nel buffer.

In un cursore, esiste un limite di 1 MB di dati che è possibile memorizzare nel buffer. Nella maggioranza dei casi, questo limite è sufficiente. Se si prevede di superare tale limite, è possibile utilizzare più query per creare insiemi di risultati di dimensioni inferiori. È possibile, ad esempio, specificare le colonne da restituire in un'istruzione SELECT. Se si supera il limite, è necessario controllare se l'opzione setCursorBufferSize sia impostata su un valore troppo elevato.

Se una riga per cui è in esecuzione una query contiene BLOB, è possibile utilizzare il metodo createBlobInputStream per creare un oggetto InputStream, che non ha limiti di dimensioni. Quando si utilizza un oggetto InputStream, l'insieme di risultati non è limitato a 1 MB.

Se il recupero dei dati risulta lento, provare a creare un indice di copertura. Un indice di copertura include tutte le colonne a cui si fa riferimento nella query.

Esempio di codice: recupero dei dati della tabella

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();
        }          
    }
}
Argomento successivo: Uso delle transazioni
Argomento precedente: Utilizzo dei BLOB

Le informazioni sono state utili? Inviateci i vostri commenti.