AIR SQLite – Embarquer une base SQLite pré-remplie dans une application AIR
Dans les tutoriaux AIR SQLite précédent, on a vu comment manipuler une base de données SQLite avec les APIs AIR. Ainsi, on a pu créer une base de données, créer des tables, insérer des enregistrements, etc. Dans chacun de ces exemples, on est partis de rien et on a crée de la donnée. Dans votre contexte applicatif, le schéma d'utilisation sera sûrement différent.
Par exemple, vous avez des commerciaux nomades qui vont partir avec leur application AIR, sans pouvoir accéder à Internet. Ils ne pourront donc pas requeter votre serveur web pour récupérer des informations. Ou vous voulez leur livrer directement une base produit, sans qu'ils n'aient besoin de synchroniser leur application. Ou vous voulez tout simplement avoir une base de données pré-paramétrées avec votre structure (tables / champs) directement dans votre application pour éviter de devoir faire patienter l'utilisateur lors du premier lancement.
Bref, de nombreuses raisons peuvent vous obliger à embarquer un base SQLite. Rassurez-vous, c'est possible et assez simple mais il y a quelques points auxquels il faut faire attention.
Embarquer une base SQLite dans une application AIR (embedded)
Avant toute chose, il vous faudra disposer de la base que vous souhaitez embarquer. Une base SQLite se présente sous la forme d'un fichier. Vous pouvez créer cette base à l'aide d'une application AIR par exemple. Au final, vous aurez un fichier, que l'on va appeler "employees.db" dans les instructions suivantes. Vous pouvez nommer ce fichier comme vous le souhaitez bien sûr.
Placez ensuite ce fichier dans votre projet, au moins dans le dossier "src". Vous pouvez bien sûr le mettre dans un package. Ici, nous allons mettre notre fichier dans "employees.db" dans le package "db":
Au moment du packaging AIR en release, assurez-vous bien que votre fichier est dans le package (si vous compilez en ligne de commande, ajoutez-le comme source path supplémentaire):
Voilà, votre fichier sera contenu dans votre package .AIR. Voyons maintenant comment l'utiliser.
Utiliser une BDD SQLite embarquée
Lorsque vous placez des fichiers avec l'application dans le package applicatif comme vous venez de le faire, ceux-ci sera accessible dans le répertoire lié à l'application une fois installée (ex C:\Users\fab\AppData\Roaming\YourApp\…). Vous pouvez facilement accéder à ces fichiers grâce à une variable présente (de manière static) sur la classe File. Cette variable est nommée "applicationDirectory" et pointe sur l'endroit du disque sur lequel les fichiers sont conservés.
Pour récupérer une référence vers notre fichier "employees.db", il vous suffit de faire:
var dbFile:File = File.applicationDirectory.resolvePath("db/employees.db");
Jusque là tout va bien, sauf que vous ne pouvez pas travailler directement avec ce fichier car les fichiers présents dans "applicationDirectory" sont en lecture seule. Si vous essayez de lire ou de mettre à jour cette base, rien ne va se passer.
Mais la solution est simple, il vous suffit de copier la base de données vers un endroit disponible en lecture / écriture. Comme une BDD n'est qu'un fichier, cela se résume à copier le fichier "employees.db". Vous pouvez par exemple le copier vers "File.documentsDirectory" ou mieux même vers "File.applicationStorageDirectory" qui sert à cela.
Voici le code complet pour réaliser l'opération de copie:
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
applicationComplete="windowedapplication1_applicationCompleteHandler(event)">
<mx:Script>
<![CDATA[
import mx.events.FlexEvent;
private var conn:SQLConnection;
protected function windowedapplication1_applicationCompleteHandler(event:FlexEvent):void {
var dbFile:File = File.applicationDirectory.resolvePath("db/employees.db");
var dbRWFile:File = File.applicationStorageDirectory.resolvePath("employeesRW.db");
// tester si le fichier existe, selon le comportement souhaité
//if (!dbRWFile.exists) {
// copie avec option overwrite
dbFile.copyTo(dbRWFile, true);
//}
// notre base dbFile est accessible, ouverture
conn = new SQLConnection();
try {
conn.open(dbRWFile);
// on commence la transaction
var q:SQLStatement = new SQLStatement();
q.sqlConnection = conn;
var sql:String = "INSERT INTO employees (firstName, lastName, middleInitial, email, gender)" +
"VALUES (:firstName, :lastName, :middleInitial, :email, :gender)";
q.text = sql;
q.clearParameters();
q.parameters[":firstName"] = "Z";
q.parameters[":lastName"] = "Z";
q.parameters[":middleInitial"] = "Z";
q.parameters[":email"] = "z@gmail.com";
q.parameters[":gender"] = "M";
q.execute();
} catch (error:SQLError) {
trace("Error message:", error.message);
trace("Details:", error.details);
}
}
]]>
</mx:Script>
</mx:WindowedApplication>
Remarquez que si vous remplacez conn.open(dbRWFile); par conn.open(dbFile);, aucune erreur ne sera envoyée et aucun enregistrement ne sera effectué.
Articles similaires
- AIR SQLite – Utilisation des transactions (begin / commit / rollback) en synchrone
- AIR SQLite – Création d'une base de données SQLite
- AIR SQLite – Utilisation des transactions (begin / commit / rollback) en asynchrone
- AIR SQLite – Utilisation de Responder en mode asynchrone
- AIR SQLite – Création de tables SQLite et types de données







