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

29jan/112

AIR SQLite – Récupérer les données d'une base SQLite (SELECT)

Dans le dernier tutorial, on a vu comment exécuter des requêtes SQL et notamment des requêtes SQL paramétrées. On va maintenant voir comment faire pour récupérer de la donnée conservée dans notre base SQL.

Exécution d'une requête SELECT

Pour récupérer de la donnée, on utilise une requête SQL SELECT. Comme d'habitude, on encapsule notre texte SQL dans un SQLStatement que l'on aura connecté à notre SQLConnection (cf. tutoriaux précédents).

Pour la syntaxe, et les options possibles (WHERE, GROUP BY, HAVING, ORDER BY), cela se trouve sur cette page:

http://sqlpro.developpez.com/cours/sqlaz/select/#L1

Dans le cas général, on a :

SELECT [DISTINCT ou ALL] * ou liste de colonnes
FROM nom de table ou de la vue
[WHERE prédicats]
[GROUP BY ordre des groupes]
[HAVING condition]
[ORDER BY ] liste de colonnes

Vous pouvez ensuite exécuter votre requête en synchrone ou en asynchrone. Pour la syntaxe, prenez exemple sur les code de ce tutorial:

AIR SQLite – Création de tables SQLite et types de données

Accès à la données récupérée

Maintenant que votre requête a été effectuée, on va pouvoir récupérer les données contenues dans les enregistrements. Chaque ligne de la base de données récupérée sera une instance de Object. On verra dans un prochain tutorial que l'on peut typer ce retour avec itemClass. Cet instance de Object va contenir des propriétés correspondant au noms de colonne de la table.

Par exemple, si votre requête SELECT spécifie les 3 colonnes "itemId", "itemName" et "price", chaque ligne sera une instance de Object avec des propriétés nommées itemId, itemName et price. Ces propriétés contiennent les valeurs pour leur colonne respective.

Le résultat de la requête va pouvoir être récupéré directement sur le SQLStatement grâce à la méthode getResult(); une fois que la requête s'est effectuée correctement. Cette méthode getResult() renvoie un objet de type SQLResult, contenant une propriété "data". Cette propriété "data" est un tableau contenant toutes les lignes récupérées, c'est-à-dire des instances de Object.

Dans le cas d'un appel d'un appel synchrone, c'est assez simple puisque directement après le execute(), vous pouvez placer votre code de traitement du résultat. En effet, votre execute() est placé dans un bloc try / catch. Si la requête n'aboutit pas, vous passerez directement dans le catch:

...
try{
    selectStmt.execute();

    var result:SQLResult = selectStmt.getResult();
    var numResults:int = result.data.length;
    for (var i:int = 0; i < numResults; i++){
        var row:Object = result.data[i];
        var output:String = "itemId: " + row.itemId;
        output += "; itemName: " + row.itemName;
        output += "; price: " + row.price;
        trace(output);
    }
}catch (error:SQLError){
    // Information about the error is available in the
    // error variable, which is an instance of
    // the SQLError class.
}

Pour un appel asynchrone, vous allez récupérer un évènement de type SQLEvent. Dans la propriété "target" ou "currentTarget" de celui-ci, vous trouverez une référence vers votre SQLStatement qui a exécuté la requête.

Vous pouvez donc récupérer votre SQLStatement comme cela:

private function resultHandler(event:SQLEvent):void{
 var sqlStatement:SQLStatement = SQLStatement(event.target);
 var result:SQLResult = selectStmt.getResult();

 ...
}

Cela peut vous éviter de mettre votre SQLStatement comme membre de votre classe.

Récupérer les noms de colonnes de votre retour

Dans le code précédent, on a vu comment récupérer l'Object représentant chaque ligne: "row". Comme dit un peu plus haut, cet objet est en fait un tableau associatif dans lequel la clé est le nom de colonne.

Si vous souhaitez connaitre toutes les colonnes retournées, vous pouvez utiliser la syntaxe for(var … in ..):

var result:SQLResult = selectStmt.getResult();
var numRows:int = result.data.length;
if (numRows > 0){
  var firstRow:Object = result.data[0];
  for (var columnName:String in firstRow){
    output += columnName + ": " + firstRow[columnName] + "; ";
  }
}

Voilà, c'est un bonus pour ceux qui ne connaissaient pas la syntaxe for (var .. in ..) :)

Articles similaires

Commentaires (2) Trackbacks (1)
  1. Je ne connaissais pas la syntaxe for(var.. in ..) c'est un dérivé d'un for each ? En terme de rapidité ressource tu en sais plus ?
    Sinon bravo pour le ACP, tout travail mérite récompense !

  2. c'est comme un for each mais sur les propriétés de l'objet, pas sur un itérateur. cela existe aussi en JS avec une syntaxe similaire. Pour la rapidité, difficile de comparer comme cela ne renvoie pas la même chose ^^

    Merci ;)
    Fab


Leave a comment

(required)