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

7fév/114

AIR SQLite – Typer les données renvoyées par un SELECT avec itemClass

Dans le tutorial précédent, on a vu comment récupérer les données provenant de sa base SQLite embarquée avec AIR. Si vous regardez en debug le résultat de votre requête, vous verrez que celui-ci est de type Object avec une propriété par colonne.

Mais dans la plupart des cas, c'est vous qui avez crée votre base SQL ainsi que la structure des tables (colonnes, types, unicité, …). Le plus simple lorsque l'on a une application orientée objet d'un côté et un modèle de base de donnée relationnel est de faire une correspondance table / classes. Par exemple, vous avez des objets Product dans votre code ActionScript contenant des propriétés, nom / description / prix. Vous aurez logiquement un table "products" avec des colonnes nom / description / prix.

Lors d'une insertion en base de donnée de votre Product, vous allez passer toutes ses propriétés dans une requête SQL paramétrée comme on l'a vu dans un tutorial précédent. Et lorsque vous allez faire un SELECT, vous allez récupérer un Object à partir duquel vous devrez recréer un objet Product. Pour cela, vous pouvez setter toutes les propriétés ou faire un cast. Mais il y a une propriété de l'API AIR qui devient encore plus intéressante dans ce cas d'utilisation, la propriété "itemClass".

La propriété "itemClass" est une propriété de SQLStatement vous permettant de spécifier un type de retour. Pour faire simple, AIR va faire le travail de cast de votre objet en Product et au lieu de récupérer un tableau de Object, vous allez récupérer un tableau de Product. Cela simplifie le code et le rend également plus lisible.

Pour que votre "itemClass" soit valide, il faut que votre classe dispose d'un constructeur qui ne requiert aucun paramètre (car celle-ci sera instanciée par AIR automatiquement). Il faut aussi que chaque colonne de votre table ait une propriété correspondante dans la classe. Si ce n'est pas le cas, AIR considérera votre requête comme en erreur et vous tomberez dans le catch (synchrone) ou vous aurez un évènement de type SQLErrorEvent.ERROR (en fait, non, voir plus loin).

Exemple d'application

Pour illustrer l'utilisation d'itemClass, on va créer un mini-projet utilisant cette propriété. Et au lieu de créer un projet de 0, je vais reprendre celui partagé par David Tucker sur DevelopRia:

AIR API – Additional Query Techniques

Ce mini-projet contient une base pré-remplie avec des contacts (contacts.db), livrée avec l'application. Voici le contenu de cette base:

struct-base

Et voici l'objet Contact correspondant:

package vo {

 public class Contact {

 public var id:uint;
 public var firstName:String;
 public var lastName:String;
 public var middleInitial:String;
 public var email:String;
 public var gender:String;

 }
}

Comme vous pouvez le constater, chaque propriété de la classe Contact a une correspondance avec une colonne de la table contacts.

Je vous passe l'ouverture de la base de donnée, le bout de code qui nous intéresse se trouve ici:

private function callQuery( event:Event ):void {
 var q:SQLStatement = new SQLStatement();
 q.sqlConnection = conn;
 q.addEventListener( SQLEvent.RESULT, queryResult );
 q.addEventListener( SQLErrorEvent.ERROR, queryError );

 var sql:String =
 "SELECT DISTINCT * " +
 "FROM contacts " +
 "WHERE lastName LIKE :searchString " +
 "OR firstName LIKE :searchString ";

 q.parameters[":searchString"] = "%" + searchString.text + "%";
 q.itemClass = Contact;
 q.text = sql;
 q.execute();
}

private function queryResult( event:SQLEvent ):void {
 var r:SQLResult = SQLStatement(event.currentTarget).getResult();
 returnedResults.text = r.data.length.toString();
 dg.dataProvider = r.data;
}

Dans la propriété "r.data", on a notre tableau d'objets Contact, ici vu dans la perspective Debug:

sql-debug

Essayons maintenant de mettre notre application en erreur. On commente la première ligne de la classe Contact (celle qui définit la propriété id). On obtient des exceptions:

ReferenceError: Error #1056: Cannot create property id on vo.Contact.

Dans ce cas-là, contrairement à ce que dit la documentation, on passe bien dans le "result" et pas dans l'error. Seules les propriétés pour lesquelles on a trouvé un matching vont être remplies. Peut-être qu'en mode synchrone, on passe dans le catch, il faudrait vérifier.

Bon, en tout cas, ces exceptions ne devraient jamais se produire car elles peuvent compromettre l'exécution de votre code.

Téléchargement du code de l'application

Pour vous faciliter la tâche, tout est dans un fichier .FXP que vous pouvez importer directement dans Flash Builder:

Télécharger les sources

Articles similaires

Commentaires (4) Trackbacks (1)
  1. Bravo pour ce tuto sur sql dans adobe air.
    Je viens d'apprendre sql dans air en 1 heure!
    j'attends la suite du tuto avec impatience.

    Mourada.

  2. Merci ;)
    d'autres tutoriaux sont déjà disponibles. Les derniers seront publié dans les prochains jours.

    Fabien

  3. Super utile de mapper automatiquement les colonnes d'une table avec les champs d'un objet lors d'une lecture.

    Est-il possible de mapper automatiquement les champs d'un object avec les colonnes d'une table lors d'une écriture ?

    Nico

  4. Salut,
    pour l'écriture, il n'y a pas vraiment le même mécanisme. Tu peux écrire des objets AS typés dans une colonne de ta table (voir autre article sur flex-tutorial) mais si tu veux mapper colonnes / champs, tu peux simplement faire un for(var field in monObj){…} pour récupérer la liste des propriétés de ton objet et construire la requête INSERT SQL (tu auras automatiquement la liste des champs à insérer).

    Fabien


Leave a comment

(required)