Apache Adobe Flex TutorialTutoriaux Adobe Flex & AIR en Français

8fév/110

AIR SQLite – Paginer la récupération d'un SELECT avec le paramètre prefetch (pagination)

Si votre base de donnée contient des centaines, voire des milliers (voire plus) d'enregistrement, vous ne voudrez sûrement pas les afficher tous à la fois à l'utilisateur. La solution la plus simple pour afficher ces résultats de manière correcte est bien souvent la pagination. Vous allez donc récupérer seulement 20 résultats puis si l'utilisateur souhaite changer de page, 20 autres, etc. Cela permet d'être plus rapide (la requête s'exécute plus rapidement) mais aussi de ne pas surcharger l'écran de l'utilisateur. Pour réaliser cette pagination, plusieurs techniques que l'on va voir dans cet article.

La technique du "LIMIT"

La première est de faire un "LIMIT" dans votre requête SQL. Par exemple, si vous ajoutez "LIMIT 0,30" à la fin de votre requête, celle-ci ne va renvoyer que les 30 premiers résultats. Si vous voulez récupérer les 30 prochains, il vous suffira d'ajouter "LIMIT 30, 30" et ainsi de suite. Pour pouvoir réaliser ce type de pagination, il vous faudra garder quelque part, une référence vers la valeur du "curseur" actuel.

Le premier nombre d'un LIMIT correspond au curseur et le second correspond à la taille de votre page.

Concrètement, vous aurez une variable de votre classe qui va indiquer où en est la pagination (0, 30, 60, etc.).

La technique du "prefetch"

Le "LIMIT" est la première technique. La deuxième consiste à utiliser le paramètre "prefetch" (facultatif) de la méthode execute() sur SQLStatement. Vous pouvez en effet lui passer un entier qui va se comporter comme un "LIMIT":

stmt.execute(20); // only the first 20 rows (or fewer) are returned

Pour récupérer les 20 résultats suivant, il vous suffira d'exécuter la méthode next() sur le SQLStatement en lui passant la taille de votre page. Par exemple:

stmt.next(20); // retrieve the next 20 rows

Ici, vous n'avez pas besoin de garder en mémoire la position du "curseur". Celle-ci est conservée en interne dans le SQLStatement. L'inconvénient est ici que vous devez garder une référence vers votre SQLStatement d'une manière ou d'une autre au lieu de garder une référence vers la page actuelle.

La propriété "complete" de SQLResult vous aidera à déterminer quand la requête SQL (un next() par exemple) a terminé de récupérer tous les résultats. Voici par exemple le handler "result" qui peut être utilisé pour ces requêtes avec prefetch:

function selectResult(event:SQLEvent):void {
    var result:SQLResult = stmt.getResult();
    if (result.data != null) {
        // ... loop through the rows or perform other processing ... 

        if (!result.complete) {
            stmt.next(20); // retrieve the next 20 rows
        }else {
            stmt.removeEventListener(SQLEvent.RESULT, selectResult);
        }
    }
}

A vous de choisir

Chaque méthode a ses avantages et ses inconvénients. C'est selon le type de projet que vous concevez que vous devrez choisir laquelle adopter.

La première méthode vous permet de demander plusieurs pages différentes de manière asynchrone alors que la deuxième vous oblige à ré-utiliser le même SQLStatement. Mais comme vous utilisez à nouveau votre SQLStatement, vous utiliserez en même temps les listeners qui y sont déjà associé, cela peut aussi vous permettre de clarifier votre code.

Articles similaires

Commentaires (0) Trackbacks (0)

Aucun commentaire pour l'instant


Leave a comment

(required)

Aucun trackbacks pour l'instant