Entwicklungshandbuch

Local Navigation

Abrufen von Tabellendaten

Um eine Abfrage auszuführen, die Ergebnissätze zurückgibt (wie z. B. eine SELECT-Anweisung), sollten Sie die Statement.getCursor-Methode verwenden.

Der Cursor ist eine temporäre Tabelle, die den Ergebnissatz enthält. Wenn der Cursor geschlossen wird, wird die temporäre Tabelle verworfen.

Die Cursor-Schnittstelle bietet schreibgeschützten Zugriff auf den Cursor. Cursors können einfach wie permanente Tabellen abgefragt werden. Auf die Cursor-Spalten kann von Spaltenobjekten verwiesen werden, die an nachfolgende Abfragen übergeben werden.

Die Standardimplementierung der Cursor-Schnittstelle führt keine Zwischenspeicherung von Daten durch und bietet damit eine unidirektionale, ausschließlich vorwärts gerichtete Navigation. Der Versuch, zu einer Zeile vor der aktuellen Zeile zu navigieren, führt zu einem DatabaseException.

Die BufferedCursor-Klasse führt eine Zwischenspeicherung von Cursordaten durch und bietet bidirektionalen, zufälligen Datenzugriff, wobei jedoch die Datenmenge, die sie verarbeiten kann, beschränkt ist. Der gepufferte Cursor kann ein OutOfMemoryError ausgeben, wenn er mit sehr großen Ergebnissätzen verwendet wird.

Standardmäßig wird eine Zeile auf einmal gepuffert. Wenn sich der Cursor über den gepufferten Satz hinaus bewegt, wird automatisch ein neuer Zeilenstapel abgerufen. Um die Leistung zu verbessern, können Sie die Puffergröße auf einen Wert größer als 1 erhöhen. Sie können die Statement.setCursorBufferSize-Methode verwenden, um die Anzahl der Zeilen festzulegen, die gleichzeitig gepuffert werden.

Die Datenmenge, die in einem Cursor gepuffert werden kann, ist auf 1 MB beschränkt. In den meisten Fällen ist diese Menge ausreichend. Wenn Sie erwarten, dass die Menge überschritten wird, können Sie mehrere Abfragen verwenden, um kleinere Ergebnissätze zu erstellen. Sie können zum Beispiel festlegen, welche Spalten in einer SELECT-Anweisung zurückgegeben werden sollen. Wenn Sie die zulässige Menge überschreiten, sollten Sie prüfen, ob setCursorBufferSize auf einen zu hohen Wert gesetzt ist.

Wenn eine von Ihnen abgefragte Zeile BLOBs enthält, können Sie die createBlobInputStream-Methode verwenden, um ein InputStream-Objekt zu erstellen, dessen Größe nicht beschränkt ist. Wenn Sie ein InputStream-Objekt verwenden, ist Ihr Ergebnissatz nicht auf 1 MB beschränkt.

Wenn Sie feststellen, dass das Abrufen von Daten lange dauert, erwägen Sie, einen abdeckenden Index zu erstellen. Ein abdeckender Index enthält alle Spalten, auf die in der Abfrage verwiesen wird.

Codebeispiel: Abrufen von Tabellendaten

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();
        }          
    }
}
Vorheriges Thema: Arbeiten mit BLOBs

Waren diese Informationen hilfreich? Senden Sie uns Ihren Kommentar.