Citation:

Le kit de développement d'Adobe AIR et son moteur d'exécution sont disponibles dès aujourd'hui en version Bêta (uniquement pour Windows et Mac OS X, une version Linux sera disponible dans les prochains jours). L'éditeur annonce également le début des inscriptions a Adobe AIR Developper Derby, un concours ouvert a tous les programmeurs en herbe. Le concours distinguera la meilleure application basé sur la technologie AIR lors du salon Adobe MAX 2007.

Video de présentation sur Adobe Air sur le site officiel : http://labs.adobe.com/technologies/air/

1. SGBD local

Bien que le concept de bases de données (BDD) locales doit être connu par une majorité des développeurs s’initiant a AIR, un petit rappel de leur propriétés n’est surement pas de trop et permettra de comprendre l’utilité de leur intégration.

La différence majeure avec les serveurs de bases de données : les bases de données locales résident dans un fichier quelque part sur le système de fichiers local et les serveurs de bases de données sur … un serveur. Les BDD locales n’ont pas besoin d’un gestionnaire de bases de données, toutes les opérations sont effectués directement sur le fichier et on peut aussi noter l’absence de procédure d’installation et de configuration.

Ces quelques propriétés entraînent les points suivants :

+ Un coût très faible
+ La possibilité du travail offline
+ La sécurisation de données importantes
- Les accès concurrents limités
- Une capacité assez faible
- Des performances qui s’amenuisent fortement lorsque le nombre d’accès et la capacité deviennent importants
- Des problèmes d’intégrité des données (Pas de contrôle des transactions, des accès concurrents, etc…)

Il existe plusieurs implémentations de bases de données locales : Paradox, Access, dBASE, etc…

2. SQLite

Avant tout chose SQLite est disponible uniquement sous AIR. Elle a ses limites contrairement au SGBD classique. Il faut savoir que SQLite n'implémente pas :

la gestion des droits avec GRANT et REVOKE,
la gestion des clés étrangères,
les jointures de type RIGHT OUTER JOIN et FULL OUTER JOIN,
les triggers ne sont que partiellement pris en compte,
les possibilités de modifier la structure d'une table sont limitées : on peut renommer une table et y ajouter des colonnes, mais pas modifier ou supprimer des colonnes,
la gestion accès concurrentiels multiples.

Citation:

SQLite est une petite bibliothèque écrite en C qui propose un moteur de base de données SQL et implémentant en grande partie le standard SQL92 et les propriétés ACID. Contrairement aux serveurs de bases de données comme MySQL ou PostgreSQL, sa particularité est de ne pas reproduire le schéma habituel client/serveur mais d’être intégré directement aux programmes en utilisant des fichiers de bases de données. D. Richard Hipp, le créateur de SQLite, a choisi de distribuer cette bibliothèque dans le domaine public.

Plus de details sur SQLite : http://www.sqlite.org/

3. En pratique

Ce dont vous avez besoin :

Adobe Flex Builder 3 : http://labs.adobe.com/technologies/flex/flexbuilder3/

Simplifier la creation de SQLite avec “SQLite administrator » : http://sqliteadmin.orbmu2k.de/

Attention, sachant qu’il s’agit d’une version beta, des changements sont a prévoir sur l’API d’AIR.
De ce fait, il est conseillé d’externaliser dans une classe, les accès aux données de vos programmes afin qu’aux prochains changements , uniquement cette classe devra être modifiée.

Vous pouvez télécharger les sources en rar, ici.

Je précise que l’exemple si dessous ne correspond pas au contenu de l’archive. Pour la simple raison, que celle-ci est plus détaillée.

Exemple de code pour comprendre comment ça marche :

import flash.data.SQLResult;
import flash.filesystem.File;
import flash.data.SQLStatement;
import flash.data.SQLConnection;
import flash.events.SQLEvent;
import flash.events.SQLErrorEvent;

import User;

private var exampleDB:SQLConnection;
private var exampleDBFile:File;
private var dbStatement:SQLStatement;

Bindable
private var userData:Array;

private function init():void {

   initAndOpenDatabase();

}

private function initAndOpenDatabase():void {

   exampleDBFile = new File("app-resource:/ExampleDatabase.db");
   exampleDB = new SQLConnection();
   exampleDB.addEventListener(SQLEvent.OPEN, onExampleDBOpened);
   exampleDB.addEventListener(SQLErrorEvent.ERROR, onExampleDBError);
   exampleDB.open(exampleDBFile);

}

private function onExampleDBOpened(event:SQLEvent):void {

   if (event.type == "open")
   {
       getRecords();
   }

}

private function onExampleDBError(event:SQLEvent):void { }

private function getRecords():void {

   dbStatement = new SQLStatement();
   dbStatement.itemClass = User;
   dbStatement.sqlConnection = exampleDB;
   var sqlQuery:String = "select * from Users";
   dbStatement.text = sqlQuery;
   dbStatement.addEventListener(SQLEvent.RESULT, onDBStatementSelectResult);
   dbStatement.execute();

}

private function onDBStatementSelectResult(event:SQLEvent):void {

   var result:SQLResult = dbStatement.getResult();
   if (result != null)
   {
       userData = result.data;
   }

}

private function onDBStatementInsertResult(event:SQLEvent):void {

   if (exampleDB.totalChanges >= 1)
   {
       getRecords();
   }

}

private function addUserToDatabase(user:User):void {

   var sqlInsert:String = "insert into Users values('"+user.firstname+"','"+user.lastname+"','"+user.email+"');";
   dbStatement.text = sqlInsert;
   dbStatement.removeEventListener(SQLEvent.RESULT, onDBStatementSelectResult);
   dbStatement.addEventListener(SQLEvent.RESULT, onDBStatementInsertResult);
   dbStatement.execute();

}

private function onAddUserButtonClicked(event:MouseEvent):void {

   var user:User = new User();
   user.firstname = firstNameTextInput.text;
   user.lastname = lastNameTextInput.text;
   user.email = emailTextInput.text;
   addUserToDatabase(user);

}

private function onUsersDataGridChanged(event:Event):void { }

private function onRemoveUserButtonClicked(event:MouseEvent):void {

   removeUserFromDatabase(usersDataGrid.selectedItem as User);

}

private function removeUserFromDatabase(user:User):void {

   var sqlDelete:String = "delete from Users where firstname='"+
                                 user.firstname+"' and lastname='"+
                                 user.lastname+"' and email='"+user.email+"';";
   trace("sqlDelete="+sqlDelete);
   dbStatement.text = sqlDelete;
   dbStatement.removeEventListener(SQLEvent.RESULT, onDBStatementInsertResult);
   dbStatement.addEventListener(SQLEvent.RESULT, onDBStatementDeleteResult);
   dbStatement.execute();

}

private function onDBStatementDeleteResult(event:SQLEvent):void {

   if (exampleDB.totalChanges >= 1)
   {
       getRecords();
   }

}

Source : http://seantheflashguy.com/blog/2007/06/14/super-simple-sqlite-example-for-adobe-air-1-beta/

J'espère que vous avez apprécié ce mini tutorial sur adobe Air et SQLite. N'hésitez pas a laisser vos commentaires.

Il est possible que le code ne s'affiche pas clairement, si vous savez formater du code sous Dotclear, dites le moi, car il me fait des choses pas net.