Aller au contenu

Section 2 : DB Browser pour SQLite

Cette section vous apprendra à utiliser DB Browser pour SQLite, un outil graphique essentiel pour le développement d'applications mobiles.

Utilisation dans le développement mobile :

  • Concevoir visuellement le schéma avant d'écrire le code Room
  • Prototyper et tester les requêtes SQL
  • Analyser les bases de données extraites d'appareils Android/iOS
  • Déboguer les problèmes de données en développement
  • Générer les scripts SQL pour les migrations Room

Workflow professionnel

  1. Concevoir : Créer le schéma dans DB Browser
  2. Tester : Insérer des données de test et valider les requêtes
  3. Exporter : Générer le script SQL
  4. Implémenter : Créer les entités Room dans Android
  5. Déboguer : Extraire et analyser la base de l'app avec DB Browser

2.1 Installation de DB Browser

DB Browser pour SQLite est un outil graphique open-source pour créer, gérer et modifier des bases de données SQLite.

Installation

  1. Téléchargez l'installeur depuis sqlitebrowser.org/dl
  2. Choisissez la version Standard installer
  3. Exécutez l'installeur et suivez les instructions
  4. Lancez DB Browser for SQLite depuis le menu Démarrer
sudo apt update
sudo apt install sqlitebrowser

Lancez ensuite :

sqlitebrowser

Via Homebrew :

brew install --cask db-browser-for-sqlite

Ou téléchargez le fichier .dmg depuis sqlitebrowser.org

2.2 Interface de DB Browser

Lancez DB Browser et familiarisez-vous avec l'interface :

Interface DB Browser

Onglets principaux

  1. Structure de base de données : Visualiser les tables, index, triggers
  2. Parcourir les données : Afficher et filtrer les données
  3. Modifier les données : Interface d'édition des données
  4. Exécuter SQL : Console SQL pour exécuter des requêtes
graph TB
    A[DB Browser] --> B[Structure de BD]
    A --> C[Parcourir les données]
    A --> D[Modifier les données]
    A --> E[Exécuter SQL]

    style A fill:#e1f5ff
    style B fill:#fff9c4
    style C fill:#f3e5f5
    style D fill:#c8e6c9
    style E fill:#ffccbc

2.3 Ouvrir la base de données existante

Exercice 8 : Ouvrir la base TODO

  1. Cliquez sur Ouvrir une base de données (icône de dossier)
  2. Naviguez jusqu'au fichier todo.db créé dans la section 1
  3. Explorez les tables dans l'onglet Structure de base de données
  4. Visualisez les données dans l'onglet Parcourir les données

Ouvrir une base de données

Exploration guidée
  • Dans Structure de base de données, développez les tables
  • Double-cliquez sur une table pour voir sa structure
  • Dans Parcourir les données, sélectionnez différentes tables dans le menu déroulant

2.4 Création d'une nouvelle base de données

Exercice 9 : Créer une base de données bibliothèque

Créer la base de données

  1. FichierNouvelle base de données
  2. Nommez le fichier bibliotheque.db
  3. Choisissez l'emplacement de sauvegarde

Créer la table Auteurs

  1. Onglet Structure de base de données
  2. Cliquez sur Créer une table
  3. Nom de la table : Auteurs
  4. Ajoutez les champs suivants :

    Nom Type Contraintes
    id INTEGER PK, AI (Primary Key, AutoIncrement)
    nom TEXT NOT NULL
    prenom TEXT NOT NULL
    nationalite TEXT -
    date_naissance DATE -

    Note importante sur les dates dans SQLite

    SQLite n'a pas de type de données DATE natif. Bien que la syntaxe DATE soit acceptée, les dates sont stockées selon l'un des formats suivants :

    • TEXT : format ISO-8601 (YYYY-MM-DD)
    • INTEGER : timestamp Unix (secondes depuis 1970-01-01)
    • REAL : jour julien

    Il est recommandé d'utiliser le format TEXT avec ISO-8601 pour une meilleure lisibilité et compatibilité avec les fonctions de dates SQLite (date(), datetime(), etc.).

  5. Cliquez sur OK

Créer une table

Raccourci

  • PK : Primary Key (Clé primaire)
  • AI : AutoIncrement (Auto-incrément)
  • NN : Not Null (Non nul)
  • U : Unique (Unique)

Créer la table Livres

  1. Cliquez sur Créer une table
  2. Nom : Livres
  3. Ajoutez les champs :

    Nom Type Contraintes
    id INTEGER PK, AI
    titre TEXT NOT NULL
    isbn TEXT UNIQUE
    auteur_id INTEGER NOT NULL
    annee_publication INTEGER -
    genre TEXT -
    nombre_pages INTEGER -
  4. Onglet Foreign Keys :

    • Cliquez sur Ajouter
    • Colonne : auteur_id
    • Table de référence : Auteurs
    • Colonne de référence : id
    • On Delete : CASCADE
  5. Cliquez sur OK

Créer la table Emprunts

  1. Nom : Emprunts
  2. Champs :

    Nom Type Contraintes Valeur par défaut
    id INTEGER PK, AI -
    livre_id INTEGER NOT NULL -
    nom_emprunteur TEXT NOT NULL -
    date_emprunt DATE - CURRENT_DATE
    date_retour_prevue DATE - -
    date_retour_effective DATE - -
  3. Foreign Keys :

    • livre_idLivres(id) ON DELETE CASCADE

2.5 Insertion de données via l'interface

Exercice 10 : Ajouter des données

Méthode 1 : Via l'onglet "Parcourir les données"

  1. Sélectionnez la table Auteurs dans le menu déroulant
  2. Cliquez sur Nouveau enregistrement (icône +)
  3. Remplissez les champs (laissez id vide, il sera auto-généré)
  4. Ajoutez les auteurs suivants :

    Nom Prénom Nationalité Date de naissance
    Hugo Victor France 1802-02-26
    Camus Albert France 1913-11-07
    Yacine Kateb Algérie 1929-08-02
    García Márquez Gabriel Colombie 1927-03-06
  5. Cliquez sur Écrire les modifications (icône disquette)

Méthode 2 : Via SQL

  1. Onglet Exécuter SQL
  2. Saisissez le code suivant :

    -- Livres
    INSERT INTO Livres (titre, isbn, auteur_id, annee_publication, genre, nombre_pages) 
    VALUES 
        ('Les Misérables', '978-2070409228', 1, 1862, 'Roman historique', 1232),
        ('L''Étranger', '978-2070360024', 2, 1942, 'Roman philosophique', 186),
        ('La Peste', '978-2070360420', 2, 1947, 'Roman', 279),
        ('Nedjma', '978-2020006415', 3, 1956, 'Roman', 256),
        ('Cent ans de solitude', '978-2020024488', 4, 1967, 'Réalisme magique', 417);
    
    -- Emprunts
    INSERT INTO Emprunts (livre_id, nom_emprunteur, date_emprunt, date_retour_prevue) 
    VALUES 
        (1, 'Ahmed Benali', '2024-12-01', '2024-12-15'),
        (2, 'Fatima Zahra', '2024-12-10', '2024-12-24'),
        (3, 'Mohamed Salah', '2024-12-15', '2024-12-29');
    
  3. Cliquez sur ▶ Exécuter (ou appuyez sur F5)

  4. Cliquez sur Écrire les modifications

N'oubliez pas d'enregistrer

Les modifications ne sont appliquées qu'après avoir cliqué sur Écrire les modifications

2.6 Visualisation et filtrage des données

Exercice 11 : Explorer les données

Filtrage simple

  1. Onglet Parcourir les données → Sélectionnez Livres
  2. Utilisez le champ Filtre en haut :
  3. genre = 'Roman'
  4. annee_publication > 1900
  5. nombre_pages > 200

Tri des données

  • Cliquez sur les en-têtes de colonnes pour trier
  • Cliquez à nouveau pour inverser l'ordre

Recherche rapide

  • Utilisez Ctrl+F (ou Cmd+F sur Mac) pour rechercher dans la table actuelle

2.7 Requêtes SQL avancées

Exercice 12 : Requêtes complexes

Dans l'onglet Exécuter SQL, testez les requêtes suivantes :

Vue complète des livres avec leurs auteurs

SELECT 
    l.titre,
    l.isbn,
    a.prenom || ' ' || a.nom as auteur,
    a.nationalite,
    l.annee_publication,
    l.genre
FROM Livres l
JOIN Auteurs a ON l.auteur_id = a.id
ORDER BY l.annee_publication DESC;

Livres actuellement empruntés

SELECT 
    l.titre,
    a.prenom || ' ' || a.nom as auteur,
    e.nom_emprunteur,
    e.date_emprunt,
    e.date_retour_prevue,
    CASE 
        WHEN e.date_retour_prevue < date('now') THEN 'En retard'
        ELSE 'Dans les délais'
    END as statut
FROM Emprunts e
JOIN Livres l ON e.livre_id = l.id
JOIN Auteurs a ON l.auteur_id = a.id
WHERE e.date_retour_effective IS NULL
ORDER BY e.date_retour_prevue;

Statistiques par auteur

SELECT 
    a.prenom || ' ' || a.nom as auteur,
    COUNT(l.id) as nombre_livres,
    ROUND(AVG(l.nombre_pages), 0) as moyenne_pages,
    MIN(l.annee_publication) as premiere_publication,
    MAX(l.annee_publication) as derniere_publication
FROM Auteurs a
LEFT JOIN Livres l ON a.id = l.auteur_id
GROUP BY a.id
ORDER BY nombre_livres DESC;
Résultats attendus

Vous devriez voir :

  • Albert Camus avec 2 livres
  • Les autres auteurs avec 1 livre chacun
  • Les moyennes de pages par auteur

2.8 Modification de structure

Exercice 13 : Modifier la structure

Ajouter une colonne

  1. Clic droit sur la table LivresModifier la table
  2. Cliquez sur Ajouter un champ
  3. Nom : prix
  4. Type : REAL
  5. Cliquez sur OK

Mettre à jour les prix

1
2
3
4
5
UPDATE Livres SET prix = 25.50 WHERE id = 1;
UPDATE Livres SET prix = 12.00 WHERE id = 2;
UPDATE Livres SET prix = 15.50 WHERE id = 3;
UPDATE Livres SET prix = 18.00 WHERE id = 4;
UPDATE Livres SET prix = 22.00 WHERE id = 5;

Modification en masse

Vous pouvez aussi mettre à jour plusieurs enregistrements en une seule requête :

UPDATE Livres SET prix = 15.00 WHERE annee_publication < 1950;

2.9 Création de vues

Exercice 14 : Créer des vues

Les vues sont des requêtes SQL enregistrées qui se comportent comme des tables virtuelles.

Vue des livres disponibles

CREATE VIEW Livres_Disponibles AS
SELECT 
    l.id,
    l.titre,
    a.prenom || ' ' || a.nom as auteur,
    l.genre,
    l.prix
FROM Livres l
JOIN Auteurs a ON l.auteur_id = a.id
WHERE l.id NOT IN (
    SELECT livre_id 
    FROM Emprunts 
    WHERE date_retour_effective IS NULL
);

Vue des emprunts en cours

CREATE VIEW Emprunts_En_Cours AS
SELECT 
    e.id,
    l.titre,
    e.nom_emprunteur,
    e.date_emprunt,
    e.date_retour_prevue,
    julianday(e.date_retour_prevue) - julianday('now') as jours_restants
FROM Emprunts e
JOIN Livres l ON e.livre_id = l.id
WHERE e.date_retour_effective IS NULL;

Utiliser les vues

Les vues apparaissent maintenant dans l'onglet Parcourir les données. Vous pouvez les interroger comme des tables normales !

2.10 Import/Export de données

Exercice 15 : Importer et exporter

Export en CSV

  1. Onglet Parcourir les données → Sélectionnez Livres
  2. FichierExporterTable(s) en CSV...
  3. Choisissez le nom et l'emplacement
  4. Configurez les options (séparateur, guillemets, etc.)

Import depuis CSV

  1. FichierImporterTable depuis fichier CSV...
  2. Sélectionnez le fichier CSV
  3. Configurez les options d'import :
  4. Nom de la table
  5. Première ligne contient les en-têtes
  6. Séparateur de champs
  7. Prévisualisez et importez

Export complet de la base

-- Méthode 1 : Via le menu
-- Fichier → Exporter → Base de données en fichier SQL...

Ou via SQL :

1
2
3
4
-- Dans l'onglet Exécuter SQL
.output bibliotheque_backup.sql
.dump
.output stdout

Sauvegarde régulière

Pensez à exporter régulièrement votre base de données pour éviter toute perte de données.

2.11 Optimisation et maintenance

Exercice 16 : Index et optimisation

Créer des index

Les index accélèrent les recherches sur les colonnes fréquemment utilisées.

1
2
3
4
5
6
7
8
-- Index sur le titre des livres
CREATE INDEX idx_livres_titre ON Livres(titre);

-- Index sur l'auteur
CREATE INDEX idx_livres_auteur ON Livres(auteur_id);

-- Index sur le livre emprunté
CREATE INDEX idx_emprunts_livre ON Emprunts(livre_id);

Analyser et optimiser

1
2
3
4
5
6
7
8
-- Analyser les statistiques
ANALYZE;

-- Nettoyer la base (récupérer l'espace)
VACUUM;

-- Vérifier l'intégrité
PRAGMA integrity_check;
Quand créer des index ?

Créez des index sur :

  • Les colonnes utilisées dans WHERE
  • Les colonnes utilisées dans JOIN
  • Les colonnes utilisées dans ORDER BY

Évitez les index sur :

  • Les petites tables
  • Les colonnes rarement utilisées
  • Les tables avec beaucoup d'INSERT/UPDATE

2.12 Exercice final intégré

Exercice 17 : Application complète

Créez une application de gestion complète en suivant ces étapes :

Étape 1 : Enrichir la base

  1. Ajoutez 5 nouveaux auteurs de votre choix
  2. Ajoutez 10 nouveaux livres avec différents genres
  3. Créez 5 emprunts avec différentes dates

Étape 2 : Requêtes d'analyse

Créez les requêtes suivantes :

Livres en retard avec pénalités

SELECT 
    l.titre,
    a.prenom || ' ' || a.nom as auteur,
    e.nom_emprunteur,
    e.date_retour_prevue,
    julianday('now') - julianday(e.date_retour_prevue) as jours_retard,
    l.prix * 0.10 * (julianday('now') - julianday(e.date_retour_prevue)) as penalite
FROM Emprunts e
JOIN Livres l ON e.livre_id = l.id
JOIN Auteurs a ON l.auteur_id = a.id
WHERE e.date_retour_effective IS NULL 
  AND e.date_retour_prevue < date('now')
ORDER BY jours_retard DESC;

Montant total des livres empruntés par personne

1
2
3
4
5
6
7
8
SELECT 
    e.nom_emprunteur,
    COUNT(e.id) as nombre_emprunts,
    SUM(l.prix) as montant_total
FROM Emprunts e
JOIN Livres l ON e.livre_id = l.id
GROUP BY e.nom_emprunteur
ORDER BY montant_total DESC;

Top 3 des genres les plus empruntés

1
2
3
4
5
6
7
8
9
SELECT 
    l.genre,
    COUNT(e.id) as nombre_emprunts,
    ROUND(AVG(l.prix), 2) as prix_moyen
FROM Emprunts e
JOIN Livres l ON e.livre_id = l.id
GROUP BY l.genre
ORDER BY nombre_emprunts DESC
LIMIT 3;

Félicitations !

Vous maîtrisez maintenant DB Browser pour SQLite ! 🎉


Synthèse et bonnes pratiques

Points clés à retenir

Quand utiliser chaque outil ?

sqlite3 (CLI) pour :

  • Scripts automatisés
  • Intégration CI/CD
  • Administration système
  • Traitement par lots

DB Browser pour :

  • Développement visuel
  • Exploration de données
  • Prototypage rapide
  • Formation et apprentissage

Bonnes pratiques

  • Toujours utiliser des transactions pour les modifications multiples
  • Définir des contraintes (PRIMARY KEY, FOREIGN KEY, UNIQUE)
  • Créer des index sur les colonnes fréquemment recherchées
  • Utiliser PRAGMA foreign_keys = ON pour activer les clés étrangères
  • Faire des sauvegardes régulières avec export SQL
  • Tester l'intégrité avec PRAGMA integrity_check

Commandes essentielles

-- Activer les clés étrangères
PRAGMA foreign_keys = ON;

-- Voir la configuration
PRAGMA database_list;

-- Analyser une table
PRAGMA table_info(nom_table);

-- Optimiser
VACUUM;
ANALYZE;

Ressources supplémentaires