Actualités

[28/04/2017] Smile annonce son plan stratégique Open Arrow 2021 et accueille à son capital EURAZEO PME, nouvel actionnaire de référence qui succède à Keensight Capital

Smile, leader de l’intégration et l’infogérance de solutions open source, choisit son nouvel actionnaire majoritaire et s’offre de nouveaux moyens lui permettant le déploiement de son plan stratégique OPEN ARROW 2021 visant à créer un nouveau champion européen de l’IT de plus de 200M€ de chiffre d’affaires.

[25/04/2017] Smile est à nouveau Strategic Partner Alfresco !

Pour la quatrième année consécutive, Smile est Strategic partner Alfresco, le plus haut niveau de partenariat !

[12/04/2017] Smile décroche le statut de Partenaire Global Elite Magento !

Smile est très heureux d'annoncer que nous devenons Partenaire Global Elite Magento - un statut accordé à seulement 5 entreprises dans le monde !

Toutes les actualités picto
       

Vous avez besoin de mettre à jour votre Lecteur Flash Flash 7

Guillemet ouvrant l'actualité des solutions
et des technologies open source Guillemet fermant
picto

Créer une application PhoneGap pour Windows Phone en utilisant une base de données locale

Nous allons présenter dans cette suite d'articles les différentes étapes nécessaires pour réaliser une application mobile PhoneGap/Cordova utilisant une base de données locale pré-remplie, et ce pour les OS cibles suivants : iOS, Android et Windows Phone 7/8.
Nous nous pencherons tout particulièrement sur Windows Phone 7/8, qui n'offre pas nativement la fonctionnalité Web SQL Database.

La spécification d'une API pour stocker, en base de données, des données qui peuvent être requêtées par un dérivé du SQL au sein d'un navigateur (alias Web SQL Database) n'a jamais abouti et n'aboutira jamais puisqu'elle a été abandonnée.
Cependant, de nombreux navigateurs ont implémenté ce « standard ». Parmi eux, Chrome, Safari et Opera pour les navigateurs desktop, mais surtout iOS Safari et Android Browser pour les terminaux mobiles.
Dans le contexte d'une application mobile PhoneGap dans laquelle nous souhaitons stocker de nombreuses informations (mode hors ligne) avec possibilité d'effectuer des recherches (entre autres), la solution qui vient à l'idée est d'utiliser Web SQL Database.
Mais ce choix pose deux problèmes principaux :

  • Le mode hors ligne doit fonctionner dès le premier lancement de l'application, même sans accès réseau, et surtout sans latence. Il faut donc que l'application embarque des données initiales (qui seront par la suite mises à jour par Web Service différentiel),
  • Web SQL Database n'est pas disponible sous Windows Phone 7/8 (contrairement à iOS et Android).

Dans ce premier article, nous aborderons les étapes nécessaires pour implémenter Web SQL Database sous Windows Phone 7/8.
Dans un second article, nous évoquerons les étapes nécessaires pour pré-charger une base de données efficacement sous les différents OS cibles.

Implémentation de Web SQL Database pour Windows Phone 7 et 8

Le navigateur présent dans Windows Phone 7 et 8 ne propose pas l’API Web SQL Database. Nous avons donc décidé de créer un plugin PhoneGap implémentant cette API.
Pour ce faire, nous avons besoin de 2 briques :

  • Du code natif C# stockant les données, permettant de les requêter en SQL et exposant des méthodes au JavaScript,
  • Du code JavaScript implémentant l’API Web SQL Database et appelant du code natif.
Choix de l’implémentation C#

Pour le choix de l’implémentation en C#, nous avons étudié les possibilités suivantes :

  • Utilisation de la base de données Linq présente au niveau d’une application Windows Phone,
  • Utilisation d’une implémentation “standalone”.

Le choix “Linq” pose de nombreux problèmes car cette base de données :

  • Ne permet pas d’exécuter du SQL transactionnel (ExecuteQuery non disponible sous Windows Phone),
  • Nécessite la création d’objets C# pour le mapping. Or, nous souhaitons que le plugin PhoneGap dispense le développeur d’écrire du code natif,
  • Ne stocke pas les données au format SQLite. Or c’est le cas des autres implémentations (iOS, Android et toutes les implémentations existantes de Web SQL Database), ce qui nécessiterait un travail supplémentaire pour fournir une base de données initiale pour Windows Phone si l’on choisissait Linq,
  • N’implémente probablement pas le dialecte “Sqlite 3.6.19” requis par la spécification W3C.

Nous nous tournons donc vers l’utilisation d’une implémentation “standalone”. Toutes les implémentations existantes de Web SQL Database ayant été réalisées à base de SQLite (c.f.: http://www.w3.org/TR/webdatabase : “all interested implementors have used the same SQL backend (Sqlite)”), nous choisissons donc d’utiliser l’implémentation C# : http://sqlitewindowsphone.codeplex.com/.

Cette implémentation pose cependant 2 problèmes :

  • Il n’est pas possible d’obtenir un résultat de requête non typé. Il faut donc créer un objet C# pour chaque type de résultat…,
  • La bibliothèque utilise un répertoire temporaire pour lequel une application Windows Phone n’a pas les droits d’accès, ce qui cause un plantage.

Nous décidons donc de créer un fork de cette bibliothèque en apportant les modifications suivantes :

  • Création d’une fonction retournant un résultat non typé sous forme d’une liste de dictionnaires clé (string) - valeur (object),
  • Modification du code accédant au répertoire temporaire pour utiliser, à la place, un répertoire dans le scope de l’application.

Nous terminons l’écriture du code natif C# en implémentant les fonctions “openDatabase” et “executeSql” qui effectuent sérialisation et désérialisation JSON, utilisent le code de la bibliothèque SQLite et appellent les callback vers le code JavaScript (c.f. : https://github.com/Smile-SA/cordova-plugin-websqldatabase/blob/master/src/wp/WebDatabase.cs).
Notons l’utilisation d’une bibliothèque supplémentaire (Newtonsoft.Json) pour la sérialisation/désérialisation JSON car la bibliothèque initialement utilisée par Cordova n’était pas satisfaisante (sérialisation non récursive, objets mal sérialisés ? …).

Implémentation JavaScript de l’API Web SQL Database

PhoneGap fournissant une implémentation de l’API Web SQL Database dans le fichier cordova.js pour Android, nous décidons de nous inspirer fortement de son code pour implémenter l’ensemble des fonctionnalités de l’API.
Le code fourni par PhoneGap est asynchrone, c’est-à-dire que les transactions et requêtes sont transmises à la partie native parallèlement sans attente de réponse de la requête/transaction précédente avant l’envoi de la suivante. Or, la bibliothèque native choisie précédemment n’est pas thread-safe : l'exécution simultanée de plusieurs opérations n'est pas garantie (dans notre cas, une exception est levée). Nous sommes donc contraints de synchroniser les appels. Nous avons choisi d’effectuer cette synchronisation côté JavaScript en gérant des queues de transactions et requêtes.

Packaging en plugin Cordova 3

Nous avons finalement ajouté un fichier plugin.xml pour que le plugin puisse être packagé en plugin Cordova 3.

Utilisation du plugin

Le plugin Cordova 3 est disponible sur le repository GitHub ainsi que sur le registry des plugins Cordova.

Il est alors possible d’utiliser ce plugin dans un projet Cordova en exécutant simplement la commande suivante :

cordova plugin add org.smile.websqldatabase.wpdb

Une fois la commande exécutée, vous pourrez utiliser l’API Web SQL Database dans votre application sans vous soucier de la compatibilité avec Windows Phone 7 et 8, sans avoir besoin d’importer quelque fichier que ce soit (le système de plugin Cordova 3 gère toutes ces tâches à votre place).
Pour finir, nous avons mis à disposition un prototype pour donner un exemple du résultat obtenu.

Nous verrons dans un second article comment pré-charger une base de données à l’initialisation de l’application, et ce pour iOS, Android et Windows Phone.

Maxime ROBERT
picto