Loupe

[Windows 8] Comment utiliser SQLite dans une application WinJS

Cet article s’adresse avant tout à mes étudiants de quatrième année de Supinfo Paris afin qu’ils puissent s’y référer et créer une application WinJS utilisant une base de données SQLite locale. Il traite aussi de la migration de Windows 8 à Windows 8.1 d’un projet très populaire permettant le requêtage d’une base de données SQLite (https://github.com/doo/SQLite3-WinRT).

Bien entendu, ces informations peuvent intéresser tout le monde, donc si vous vous demander comment faire, c’est par là.

SQLite for WinRT

Télécharger l’extension Visual Studio SQLite for WinRT, disponible à l’adresse suivante http://www.sqlite.org/download.html sous l’appellation Precompiled Binaries for Windows Runtime. Attention, selon l’environnement ciblé, il convient de choisir entre (à ce jour) :

  • sqlite-winrt-***.vsx pour Windows 8
  • sqlite-winrt81-***.vsx pour Windows 8.1

Redémarrer Visual Studio si celui-ci était lancé pendant l’installation.

Référencer SQLite for WinRT dans un projet WinJS

Dans Visual Studio, sous le projet WinJS visé, clic droit sur références (dans le solution explorer), ajouter une référence, onglet Windows 8(.1) > Extensions, cocher :

  • Pour Windows 8
    • SQLite for Windows Runtime
    • Microsoft Visual C++ Runtime Package for Windows
  • Pour Windows 8.1
    • SQLite for Windows Runtime (Windows 8.1)
    • Microsoft Visual C++ 2013 Runtime Package for Windows

(Laisser coché Windows Library for Javascript ou tout autre dépendance déjà sélectionnée)

Compiler avec Visual C++ Runtime

Pour compiler avec le runtime C++, il convient de quitter le mode de compilation Any CPU et de choisir x86, x64 ou ARM. Selon l’environnement de développement, il se peut que mixed platform soit disponible, auquel cas, selon configuration, cela peut être un choix convenable.

Pour modifier cela choisir dans l’interface de Visual Studio le bon mode de compilation (x86, x64 ou ARM selon l’architecture processeur visée) :

image

Si cette interface n’est pas disponible, dans le menu de Visual Studio (au même niveau que Fichier, Edition…), choisir Build (ou Générer) > Configuration Manager (ou Gestionnaire de configurations). Choisir la bonne valeur dans Active Solution Platform (Configuration de la solution active).

Ajouter le wrapper SQLite for WinJS

Suivre le tutoriel de la page : https://github.com/doo/SQLite3-WinRT, partie Setup.

Résumé :

  • télécharger le projet SQLite3Component
  • extraire l’archive
  • copier coller le répertoire SQLite3Component de l’archive dans le répertoire de la solution du projet WinJS visé (dans le solution Explorer, clic droit sur la node la solution, Open Folder in File explorer).
  • dans la solution du projet WinJS visé, clic droit, ajouter un projet existant, naviguer vers le dossier préalablement copié et sélectionner SQLite3Component.vcxproj
  • dans le projet WinJS visé, clic droit sur Références, ajouter, onglet Solution, cocher SQLite3Componenet.
  • Compiler (cela peut prendre un certain temps)

Si une erreur ce produit lors de la compilation, comme « cannot open include file ‘winre.h’ », cela est certainement due au fait que SQLite3Component vise Windows 8 alors qu’il devrait viser Windows 8.1. Dans ce cas, clic droit sur le projet SQLite3Component et choisir « Retarget to Windows 8.1 ».

Ensuite, ajouter le fichier SQLite3.js du dossier SQLite3JS\js dans le projet WinJS visée.

Créer une base de données SQLite avec WinJS

Voici un peu de code permettant de vérifier si une base de données existe ou non, et ainsi de la créer et de créer des tables si besoin est (sur le modèle de l’exemple de la page https://github.com/doo/SQLite3-WinRT), pour en requêter une enfin :

var dbFileName = "db.sqlite";
var dbPath = Windows.Storage.ApplicationData.current.localFolder.path + "\\" + dbFileName;
Windows.Storage.ApplicationData.current.localFolder.getFileAsync(dbFileName).then(function(file) {
    return file !== undefined;
}, function error() {
    return false;
}).then(function(databaseExists) {
    if (databaseExists) {
        console.log("database exists");
        return SQLite3JS.openAsync(dbPath);
    } else {
        console.log("database not exists");
        return SQLite3JS.openAsync(dbPath).then(function (db) {
            return db.runAsync('CREATE TABLE Item (name TEXT, price REAL, id INT PRIMARY KEY)').then(function() {
                return db.runAsync('INSERT INTO Item (name, price, id) VALUES (?, ?, ?)', ['Mango', 4.6, 123]).then(function() {
                    return db;
                });
            });
        });
    }
}).then(function(db) {
    return db.eachAsync('SELECT * FROM Item', function (row) {
        console.log('Get a ' + row.name + ' for $' + row.price);
    }).then(function () {
        db.close();
    });
});

Comment insérer plusieurs lignes et traiter avec les promises

Pour boucler et appeler des promises les unes à la suite des autres :

var collection =
[
    ['Mango1', 1.6, 124],
    ['Mango2', 2.6, 125],
    ['Mango3', 3.6, 126],
    ['Mango4', 4.6, 127]
];

var insertSql = 'INSERT INTO Item (name, price, id) VALUES (?, ?, ?)';
var promise = WinJS.Promise.as({});
collection.forEach(function(item) {
    promise = promise.then(function() {
        return db.runAsync(insertSql, item);
    });
});
return promise;

ou bien pour tout appeler en même temps et attendre que tout soit fini :

var promise = WinJS.Promise.join(collection.map(function(item) {
    return db.runAsync(insertSql, item);
}));

 

 

Voilà, en espérant que ça vous aide à démarrer vos projets !

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus