Guide de développement

Local Navigation

Extraction de données de table

Pour exécuter une requête qui renvoie des jeux de résultats (telle qu'une instruction SELECT), vous devez utiliser la méthode Statement.getCursor.

Cursor est une table temporaire qui contient le jeu de résultats. Lorsque Cursor est fermé, la table temporaire est mise au rebut.

L'interface Cursor fournit un accès en lecture seule à Cursor. Les objets Cursor peuvent être interrogés comme des tables persistantes. Les colonnes Cursor peuvent être référencées par des objets Column transmis dans les requêtes suivantes.

L'implémentation par défaut de l'interface Cursor ne met pas de données en cache et fournit donc une navigation unilatérale vers l'avant uniquement. Toute tentative de navigation vers une ligne avant la ligne actuelle entraîne une exception DatabaseException.

La classe BufferedCursor met en cache les données de curseur en mémoire et fournit un accès aux données bidirectionnel et aléatoire. Cependant, il existe des limites à la quantité de données qu'elle peut traiter. Le curseur mis en mémoire-tampon peut produire une erreur OutOfMemoryError s'il est utilisé avec des jeux de résultats de taille importante.

Par défaut, une ligne à la fois est mise en mémoire-tampon. Lorsque le curseur se déplace au-delà de l'ensemble mis en mémoire-tampon, un nouveau lot de lignes est automatiquement extrait. Pour améliorer les performances, vous souhaiterez peut-être définir la taille de la mémoire-tampon sur une valeur supérieure à 1. Vous pouvez utiliser la méthode Statement.setCursorBufferSize pour spécifier le nombre de lignes devant être mis en mémoire-tampon en même temps.

La quantité maximale de données pouvant être mises en mémoire-tampon dans un curseur est de 1 Mo. Dans la plupart des cas, cette limite est suffisante. Si vous pensez avoir besoin de dépasser cette limite, vous pouvez utiliser plusieurs requêtes pour créer des jeux de résultats de taille inférieure. Vous pouvez, par exemple, spécifier quelles colonnes doivent être renvoyées dans une instruction SELECT. Si vous dépassez la limite, vous devrez vérifier si setCursorBufferSize est trop défini sur une valeur trop élevée.

Si une ligne que vous interrogez contient des blobs, vous pouvez utiliser la méthode createBlobInputStream pour créer un objet InputStream, qui n'a pas de taille maximale. Lorsque vous utilisez un objet InputStream, votre jeu de résultats n'est pas limité à 1 Mo.

Si vous constatez que l'extraction de données est lente, envisagez la création d'un index de couverture. Un index de couverture inclut tous les colonnes référencées dans la requête.

Échantillon de code : extraction de données de table

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();
        }          
    }
}

Ces informations vous ont-elles été utiles ? Envoyez-nous vos commentaires.