Programmation de SQLite dans C Tutorial Two

Ce tutoriel est le deuxième d'une série sur la programmation de SQLite en C.

SQLite stocke une collection de tables dans une base de données à fichier unique, se terminant généralement par .db. Chaque tableau est comme une feuille de calcul, il se compose d'un certain nombre de colonnes et chaque ligne a des valeurs.

Si cela aide, pensez à chaque ligne comme étant une structure, les colonnes du tableau correspondant aux champs de la structure.

Une table peut avoir autant de lignes que peut tenir sur un disque. Il y a une limite supérieure mais ses énormes 18 446 744 073 709 551 616 pour être précis.

Une table peut avoir jusqu'à 2 000 colonnes ou si vous recompilez la source, vous pouvez la maximiser à 32 767 colonnes.

L'API SQLite

Pour utiliser SQLite, nous devons appeler l'API. Vous pouvez trouver une introduction à cette API sur la page Web officielle Introduction à l'interface SQLite C / C ++. C'est une collection de fonctions et facile à utiliser.

Tout d'abord, nous avons besoin d'un descripteur de la base de données. Il s'agit du type sqlite3 et est renvoyé par un appel à sqlite3_open (nom de fichier, ** ppDB). Après cela, nous exécutons le SQL.

Ayons d'abord une légère digression et créons une base de données utilisable et quelques tables en utilisant SQLiteSpy. (Voir le tutoriel précédent pour les liens vers cela et le navigateur de base de données SQLite).

Événements et lieux

La base de données about.DB contiendra trois tables pour gérer les événements sur plusieurs sites. Ces événements seront des fêtes, des discothèques et des concerts et auront lieu dans cinq lieux (alpha, bêta, charlie, delta et écho). Lorsque vous modélisez quelque chose comme ça, il est souvent utile de commencer avec une feuille de calcul. Par souci de simplicité, je vais simplement enregistrer une date et non une heure.

La feuille de calcul comporte trois colonnes: dates, lieu, type d'événement et une dizaine d'événements comme celui-ci. Dates du 21 au 30 juin 2013.

Maintenant, SQLite n'a pas de type de date explicite, il est donc plus facile et plus rapide de le stocker en tant qu'int et de la même manière qu'Excel utilise les dates (jours depuis le 1er janvier 1900) ont les valeurs int 41446 à 41455. Si vous placez les dates dans une feuille de calcul puis formatez la colonne de date sous la forme d'un nombre avec 0 décimale, cela ressemble à ceci:

Maintenant, nous pourrions stocker ces données dans une table et pour un exemple aussi simple, ce serait probablement acceptable. Cependant, les bonnes pratiques de conception de bases de données nécessitent une certaine normalisation.

Les éléments de données uniques comme le type de lieu doivent être dans leur propre tableau et les types d'événements (fête, etc.) doivent également être dans un. Enfin, comme nous pouvons avoir plusieurs types d'événements sur plusieurs sites, (une relation plusieurs à plusieurs), nous avons besoin d'une troisième table pour les contenir..

Les trois tableaux sont:

  • sites - détient les cinq sites
  • eventtypes - contient les trois types d'événements
  • événements - contient la date, l'ID du lieu et l'ID du type d'événement. J'ai également ajouté un champ de description pour cet événement, par exemple "Anniversaire de Jim".

Les deux premiers tableaux contiennent les types de données de sorte que les sites ont des noms alpha pour faire écho. J'ai également ajouté un identifiant entier et créé un index pour cela. Avec le petit nombre de sites (5) et de types d'événements (3), cela pourrait se faire sans index, mais avec des tables plus grandes, cela deviendra très lent. Donc, toute colonne susceptible d'être recherchée, ajoutez un index, de préférence un entier

Le SQL pour créer ceci est:

L'index sur la table des événements a la date, id-event, le type d'événement et le lieu. Cela signifie que nous pouvons interroger la table des événements pour "tous les événements à une date", "tous les événements sur un lieu", "toutes les parties", etc. et les combinaisons de ceux-ci, comme "toutes les parties sur un lieu", etc..

Après avoir exécuté les requêtes de création de table SQL, les trois tables sont créées. Notez que j'ai mis tout ce sql dans le fichier texte create.sql et qu'il inclut des données pour remplir certaines des trois tables.

Si vous mettez; à la fin des lignes, comme je l'ai fait dans create.sql, vous pouvez alors batch et exécuter toutes les commandes en une seule fois. Sans le ; vous devez exécuter chacun d'eux seul. Dans SQLiteSpy, cliquez simplement sur F9 pour tout exécuter.

J'ai également inclus sql pour déposer les trois tableaux dans les commentaires sur plusieurs lignes en utilisant / *… * / comme en C. Sélectionnez simplement les trois lignes et faites ctrl + F9 pour exécuter le texte sélectionné.

Ces commandes insèrent les cinq sites:

Encore une fois, j'ai inclus du texte commenté dans des tableaux vides, avec le supprimer de lignes. Il n'y a pas d'annulation donc soyez prudent avec ces!

Étonnamment, avec toutes les données chargées (certes pas beaucoup), le fichier de base de données entier sur le disque n'est que de 7 Ko.

Données d'événement

Plutôt que de créer un tas de dix instructions d'insertion, j'ai utilisé Excel pour créer un fichier .csv pour les données d'événement, puis j'ai utilisé l'utilitaire de ligne de commande SQLite3 (fourni avec SQLite) et les commandes suivantes pour l'importer.

Remarque: Toute ligne avec un préfixe point (.) Est une commande. Utilisez .help pour afficher toutes les commandes. Pour exécuter SQL, il suffit de le saisir sans préfixe de période.

Vous devez utiliser des doubles barres obliques noires \\ dans le chemin d'importation pour chaque dossier. Ne faites la dernière ligne qu'après que .import a réussi. Lorsque SQLite3 s'exécute, le séparateur par défaut est a: il doit donc être remplacé par une virgule avant l'importation.

Retour au code

Maintenant que nous avons une base de données entièrement remplie, écrivons le code C pour exécuter cette requête SQL qui retourne une liste de parties, avec description, dates et lieux.

  • Nouveau sur SQL? Lire Qu'est-ce que SQL?

Cela fait une jointure en utilisant la colonne idvenue entre le tableau des événements et des lieux afin que nous obtenions le nom du lieu et non sa valeur int idvenue.

Fonctions API SQLite C

Il existe de nombreuses fonctions, mais nous n'en avons besoin que d'une poignée. L'ordre de traitement est le suivant:

  1. Ouvrez la base de données avec sqlite3_open (), quittez si vous avez une erreur en l'ouvrant.
  2. Préparez le SQL avec sqlite3_prepare ()
  3. Boucle en utilisant slqite3_step () jusqu'à ce qu'il n'y ait plus d'enregistrements
  4. (Dans la boucle) traiter chaque colonne avec sqlite3_column…
  5. Enfin, appelez sqlite3_close (db)

Il y a une étape facultative après avoir appelé sqlite3_prepare où tous les paramètres passés sont liés, mais nous l'enregistrerons pour un futur tutoriel.

Ainsi, dans le programme répertorié ci-dessous, le pseudo-code pour les principales étapes sont:

Le sql renvoie trois valeurs, donc si sqlite3.step () == SQLITE_ROW, les valeurs sont copiées à partir des types de colonne appropriés. J'ai utilisé int et text. J'affiche la date sous forme de nombre mais n'hésitez pas à la convertir en date.

Liste d'exemples de code