Dot.Blog

C#, XAML, Xamarin, UWP/Android/iOS

SQLite sur Windows 8 (ARM et Intel)

[new:31/12/2012]Ecrire des applications intelligentes qui dépassent le niveau de la lampe de poche ou de la liste “todo” est un impératif pour qu’enfin le marché Windows 8, tant sur Smartphone que tablettes et PC puisse prendre son essor. Des softs sérieux, voire LOB, voilà ce dont à besoin Windows 8. Tout comme le PC doit en partie son succès à MultiPlan, l’ancêtre de Excel. Or il n’existe pas de machine ou d’architecture qui a pu survivre et s’imposer sans une gamme de logiciels intelligents, pros. Les jeux sont une chose mais ne permettent pas d’assoir le sérieux d’un OS. Et pour toutes ces applications il faut bien souvent une base de données… SQLite est une possibilité à étudier de près…

Une base de données embarquée

Une liste de tâches à faire genre “Any.Do”, cela se programme en deux secondes soit avec un petit fichier XML soit même un fichier texte. Une gestion de fiches de mots de passe ça se programme en utilisant par exemple la sérialisation d’une liste.

Pour des applications plus intelligentes, plus sophistiquées, plus souples, utiliser des moyens aussi rustiques déportent beaucoup trop de charge côté code, ce qui allonge le temps de développement, complique la maintenance et n’offre pas la souplesse requise.

Passé un certain point seule une vraie base de données permet au code applicatif de se concentrer sur son métier et de se libérer de la gestion des donnée.

Seulement voilà… SQL Server est une base d’une grande efficacité, mais elle ne peut convenir qu’à des applications lourdes ou en Bureau Classique (WPF et EF peuvent attaquer directement le serveur, alors que sous WinRT il faudra mettre en place un service séparé ce qui est effroyablement compliqué pour si peu).

Microsoft a conçu SQL Server Compact. Une base compatible SQL Server qui ne nécessite pas une installation lourde et qui peut même être déployée sur un serveur Web hébergé en mutualisé.

J’aime beaucoup SLQ Server Compact car, pour un site Web notamment, cela permet de mettre en place une véritable base de données très rapidement qui s’hébergera n’importe où. Et si le site connait une montée en charge importante, il est très facile de basculer sur une vraie base SQL Server puissante en changeant juste la chaîne de connexion puisque la compatibilité est absolue.

C’est un point fort de SQL Server Compact qu’il ne faut jamais négliger : la scalability.

Toutefois une application Smartphone ou tablette n’évoluera jamais dans un tel sens. Elle doit embarquer tous les moyens servant à son fonctionnement ou doit, d’emblée, fonctionner avec un ou plusieurs services distants de type Cloud, Web Service ou autre. Et le choix de passer de l’un à l’autre des modèles n’apporte pas un gain en rapidité (au contraire) mais d’autres bénéfices (ceux des données dans les nuages).

Du coup, sur les petites architectures, et par cohérence, sur toutes les applications WinRT même sur PC, il faut choisir dès le départ les moyens justes et suffisants. Choisir une base de données capable de fonctionner sur toutes les cibles, dont ARM, n’est pas si simple.

C’est là qu’intervient SQLite.

SQLite

Sa présentation est claire : “SQLite est une bibliothèque de code qui implémente un moteur de base de données transactionnel, auto-contenu, sans serveur et sans configuration” (voir http://www.sqlite.org/).

Il s’agit même du moteur SGBD le plus utilisé au monde (par exemple il y a moins 300 millions de copies avec Firefox, 20 millions de sites PHP avec un SQLite embarqué, 20 millions de Symbian, des millions de copies de l’antivirus Avast qui utilise SQLite, des millions d’IPhone avec SQLite, etc.).

En tant que que base de données pure, je n’ai jamais été un fan de SQLite. Je lui préfère SQL Server, ou même à une époque plus lointaine Interbase (et ses variantes). Toutefois, avec le temps, SQLite s’est bonifié, sa stabilité est excellente, et, dans certains, dont ceux qui nous intéressent ici, cette base de données devient un choix tout à fait pertinent.

Petit mais costaud

SQLite est … Light. Il ne faut pas en attendre toutes les possibilités de SQL Server, mais même SQL Server Compact ne fournit pas tous les services de sa grande sœur.

Mais l’essentiel est là : notamment le support total du transactionnel et d’ACID (en parlant des transactions : Atomique, Cohérente, Isolée et Durable).

j’ai pu me rendre compte avec un grand étonnement dans ces vingt dernières années à quel point les développeurs sont insensibles (ou si peu sensibles) à la notion de Base de Données Relationnelle et certainement encore mois à la notion (et à l’importance cruciale) de la bonne utilisation des transactions. J’ai arrêté depuis longtemps de faire des conférences sur les SGBD-R, les lois de Codd et le transactionnel car hélas ce ne sont plus des sujets qu’un éditeur aujourd’hui souhaite placer en tête dans ces manifestations. Hélas car je mesure encore presque chaque jour l’ignorance absolue des développeurs en ce domaine pourtant si sensible et il me semble qu’encore plus qu’hier il serait indispensable de former les gens à ces sujets.

Je republierai certainement d’anciens articles qui bien que poussiéreux à cause du temps sont toujours aussi brulant d’actualité dans leur contenu.

Mais revenons à SQLite. Elle a tout d’une grande, c’est sûr, au moins sur les fondamentaux. La gestion des transactions, vue comme un “plus” est en réalité un pré-requis in-négociable pour tout SGBD-R qui se respecte. Mais SQLite garantit que les transactions resteront ACID même en cas de crash ou de coupure de courant. Cela est en revanche un plus indéniable (même si de très vieilles bases comme Btrieve lancée en 1982 (!) firent leur publicité sur ce point il y a donc plus de vingt ans !).

Zéro configuration, c’est bien. Mais ce n’est pas une nouveauté non plus, c’était l’un des arguments massue de Borland Interbase face à SQL Server ou Oracle dès les années 80 (le produit connaitra un long parcours depuis sa création jusqu’à Ashton-Tate, les concepteurs de dBASE, jusqu’à Borland dans les années 90, puis jusqu’à Firebird un fork open source toujours utilisé et maintenu offrant de nombreux avantages proches de SQLite).

Implémentation de SQL 92. C’est le minimum en 2012 non ? Mais ne riez pas car cette norme reste que partiellement supportée par SQLite, comme ce fut le cas de Interbase ou même de Oracle qui n’est toujours full compliant à cette norme. Ce qui est gênant pour de grosses bases de données reste anecdotique pour SQLite censée être embarquée pour gérer de petits volumes de données.

La base de données est stockée dans un fichier unique (autre avantage déjà promu par Interbase et SQL Server par exemple). C’est aussi une obligation minimale de nos jours. Seule l’ancêtre dBASE gérait de multiple fichiers en réalité. Mais là aussi SQLite ajoute un petit plus… Le fichier de base de données unique a une structure disque cross-plateforme. C’est indéniablement un avantage pour des applications qui devraient tourner sur Windows Phone 8 et Android (avec MonoDroid par exemple).

SQLite support des bases de données de plusieurs Tera et des BLOB de plusieurs Giga (octets). Ce sont des limites théoriques mais elles montrent qu’une application taillée pour les unités mobiles n’aura aucun mal à supporter un passage sur PC avec des volumes traités plus gros (application Windows 8 Store notamment).

La rapidité de SQLite est aussi mise en avant. Il est vrai que dans le cadre de ses limitations le moteur ne se fatigue pas trop là où des moteurs plus riches perdent par force plus de temps à gérer les données. Mais pour le type d’application visées, la richesse fonctionnelle est un avantage qui s’efface largement devant celui de la célérité des opérations, ce qui place SQLite en bonne position.

Les API sont assez rustiques, elles ont l’avantage de tourner sur plusieurs plateformes ce qui oblige à un certain minimalisme. Toutefois vous n’aurez pas à travailler directement avec ces API, en tout cas sous .NET puisqu’il existe des packages Nuget offrant tout le nécessaire, ce que nous verrons plus loin.

Les sources sont disponibles. C’est bien. Mais franchement déjà se plonger dans un composant Infragistics ou autre réclame un sacré investissement alors se plonger dans le code ANSI-C de SQLite, à moins de vouloir créer un fork et y passer ses jours et ses nuits, cela n’a guère n’importance.

bref, voilà dans les grandes lignes les points forts présentés par le site de SQLite lui-même (sans mes commentaire !).

Une base de données correcte pour un site Web, parfaite pour de petites applications qui doivent stocker des données, bien adaptée à la création de démos de grosses applications ou de maquettes. Mais c’est tout.

Le passage de SQLite vers SQL Server ne dispose d’aucune aide ni ne repose sur aucune compatibilité. Si votre application doit un jour voguer sur des océans de données partagées, il vous faudra changer SQLite pour autre chose de plus adapté et cela se fera dans la douleur, là où SQL Server Compact rend le passage pour ainsi dire invisible.

Mais SQL Server Compact n’est pas, à mon goût, encore assez simple à installer, utiliser et configurer. Ca marche, ça supporte même Entity Framework, mais SQLite est bien plus simple encore. Et pour une application Smartphone ou tablette cela me semble un argument très favorable à SQLite (sans oublier son avantage cross-plateforme x86, x64 et ARM).

Enfin, SQLite tient dans environ 350 Ko, ce qui est négligeable de nos jours, même sur un Smartphone.

Après, c’est à chacun de juger, moi je ne fais que défricher le terrain. A vous de choisir votre route…

Installation

Il est possible de télécharger un  “vsix” pour Visual Studio depuis le site de SQLite. Mais il existe bien plus simple puisque des packages Nuget existent et permettent d’installer le moteur de base de données dans l’application en ayant besoin. J’adore le concept des packages Nuget. Chaque application dispose ainsi de ses extensions conservées et mises à jour dans son propre espace disque. On peut versionner tout cela et reprendre plus tard une application pour la maintenir sans avoir à gérer l’état de l’installation des extensions sur la machine de développement. C’est vraiment parfait.

Si vous vous rendez sur la gestion des extensions Nuget depuis Visual Studio et que vous cherchez le terme SQLite pour serez surpris de voir de très nombreux packages.

Il existe en effet plusieurs packages différents de différents auteurs permettant d’intégrer SQLite à une application. Par exemple dotConnect for SQLite vous apportera un support ADO.NET ainsi que celui de Entity Framework. Cela est un avantage certain pour designer un site Web ou une application Windows Store un peu “joufflue”.

Ce qui nous intéresse pour le moment est la version des drivers pour WinRT. Si vous sélectionnez SQLite for Windows Runtime vous disposerez alors d’un bon pilote qui utilise uniquement les opérations P/Invoke autorisées par le market place. Car il y a forcément du P/Invoke entre le code Windows 8 et la DLL ANSI-C de SQLite… Et il faut être certain que ces opérations ne viendront pas créer un barrage infranchissable lors de la validation de l’application par Microsoft…

Configuration

Une fois le package Nuget installé, il ne reste plus qu’à ajouter la référence…

On notera qu’il faut ajouter aussi le Microsoft Visual C++ Runtime Package pour que tout fonctionne correctement.

Petite astuce : n’essayez de construire une application en mode “Any CPU”, cela ne marchera pas. Vous devez choisir un build x86, x64 ou ARM. Pour cela modifier les configurations aussi bien Debug que Release.

Autre point essentiel pour le market place : placez-vous toujours en mode Release avant de déployer vers le Windows Store !

Utilisation

SQLite est maintenant disponible dans votre application, il ne vous reste plus qu’à vous plonger dans sa documentation pour en tirer le meilleur parti…

Toutefois je vous conseille d’ajouter une petite couche qui rendra l’accès aux API plus agréable. Retournez dans les packages Nuget et sélectionnez sqlite-net créé par Frank Krueger.

Ce petit ajout en C# a été conçu au départ pour MonoTouch (donc pour fonctionner sur IPhone et Ipad), mais il est compilable aussi sous profile .NET en WinRT.

S’installant au-dessus du pilote SQLite, sqlite-net simplifie grandement l’accès à la base de données en offrant une API C# simple et pratique.

Conclusion

Sans être une panacée, SQLite est une excellente petite base de données relationnelle transactionnelle ne pesant pas très lourd, sans configuration, rapide et robuste. Elle est parfaitement taillée pour les applications Smartphone ou tablette et peut parfaitement être utilisée dans des application Windows Store pour PC.

Portable, cross-plateforme, le même fichier disque peut être utilisé pour une application Windows 8, IPhone ou Android… Un gros plus si vous décidez de concevoir une application cross-plateforme fournie avec une base de données préchargée (type recettes de cuisine ou autre) puisque vous pourrez fournir le même fichier base de données dans toutes vos versions… Pour une stratégie de développement totalement cross-plateforme n’utilisant que C# et .NET, je renvoie le lecteur à mon billet en trois parties “Stratégie de développement cross-plateforme” (partie 1).

Comme d’habitude … Stay Tuned !

blog comments powered by Disqus