Avez-vous une question? (216) 97 656 803 hajjriadh@gmail.com
Flutter

Comment implémenter SQLite dans Flutter

Un cours complet pour maîtriser Comment implémenter SQLite dans Flutter.

0 chapitres 0 QCM Accès gratuit

Comment implémenter SQLite dans Flutter

  1. Etapes de réalisation

    1. Configuration de pubspec.yaml
      • Définissez "sqflite" et "path".
      • dependencies:
          flutter:
            sdk: flutter
          path_provider: ^2.1.0 
          path: ^1.6.4 
          sqflite: ^2.3.0
    2. Création d'une base de données SQLite
      • Créez la classe DatabaseHelper.
          class DatabaseHelper {
            static DatabaseHelper? _databaseHelper; // Instance unique de DatabaseHelper
            static late Database db; // Instance unique de la base de données
          
            // Nom de la table et noms des colonnes pour la table 'foods'
            static String foodTable = 'foods';
            static String colId = 'id';
            static String colTile = 'title';
            static String colPrice = 'price';
          
            // Constructeur privé pour créer une instance de DatabaseHelper
            DatabaseHelper._createInstance();
          
            // Factory pour récupérer l'instance unique de DatabaseHelper
            factory DatabaseHelper() {
              // Si l'instance n'existe pas, créez-en une nouvelle, sinon, retournez l'instance existante
              return _databaseHelper ??= DatabaseHelper._createInstance();
            }
          
            // Getter pour récupérer la base de données
            Database get database {
              return db;
            }
          
            // Initialisation de la base de données
            static Future initializeDatabase() async {
              // Récupère le répertoire d'application pour enregistrer la base de données
              final directory = await getApplicationDocumentsDirectory();
              final path = '${directory.path}/path.db';
          
              // Crée la base de données au chemin spécifié
              db = await openDatabase(path, version: 1, onCreate: _createDb);
            }
          
            // Fonction de création de la base de données
            static Future _createDb(Database db, int newVersion) async {
              // Crée la table 'foods' avec les colonnes spécifiées
              await db.execute(
                  'CREATE TABLE $foodTable($colId INTEGER PRIMARY KEY
           AUTOINCREMENT, $colTile TEXT, $colPrice INTEGER)');
              
              // Insère des données initiales dans la table (facultatif)
              await db.insert(
                foodTable,
                {'$colTile': 'chou', '$colPrice': 200},
              );
            }
          }
          
      • Comment définir la classe
        • Ceci est implémenté car il est plus pratique de définir une classe lors de l'ajout ou de la mise à jour.
        • 
          class Food {
            Food({
              this.id,
              this.title,
              this.quantity, // Ajout de la variable quantity
              this.amount, // Ajout de la variable amount
            });
          
            int? id; // ID
            String? title; // Titre
            int? quantity; // Quantité
            int? amount; // Montant
          
            Map toMap() {
              return {
                'id': id,
                'title': title,
                'quantity': quantity, // Ajout de quantity dans la conversion de la carte
                'amount': amount, // Ajout de amount dans la conversion de la carte
              };
            }
          
            Food.fromMapObject(Map map) {
              id = map['id'];
              title = map['title'];
              quantity = map['quantity']; // Assigner la valeur de la carte à la variable quantity
              amount = map['amount']; // Assigner la valeur de la carte à la variable amount
            }
          }
          
    3. Paramètres initiaux de la base de données
      • Exécutez le processus de configuration de la base de données avant de passer au premier écran de « main.dart ».
      • class MyApp extends StatelessWidget {
          @override
          Widget build(BuildContext context) {
            return MaterialApp(
              home: FutureBuilder(
                builder: (BuildContext context ,AsyncSnapshot snapshot) {
                  if(snapshot.hasData) {
                    return snapshot.data;
                  }else{
                    return const Scaffold(
                      body: Center(
                        child: CircularProgressIndicator(),
                      ),
                    );
                  }
                },
                future: setting(),
              ),
            );
          }
          Future setting() async {
            DatabaseHelper.db = await DatabaseHelper.initializeDatabase();//ajouter ici
            return HomePage();
          }
        }
  2. Opération CRUD

    1. SÉLECTIONNER
      • Définir une méthode pour récupérer toutes les données stockées dans foodTable
      • // Méthode pour récupérer la liste des aliments depuis la base de données
        Future<List<FoodStorage>> getFoodList() async {
            // Exécute une requête SQL pour récupérer toutes les lignes de la table foodTable, triées par ordre décroissant d'ID (colId)
            final result = await database.query(foodTable, orderBy: '$colId DESC');
            // Résultat est une liste de Maps où chaque Map représente une ligne de données dans la table
            // Utilise la méthode map pour appliquer une fonction de conversion à chaque élément (Map) de la liste result
            // La fonction de conversion fromMapObject() de la classe FoodStorage est utilisée pour convertir chaque Map en un objet FoodStorage
            // Ensuite, la méthode toList() est utilisée pour convertir le résultat en une liste de FoodStorage
            return result.map((Map food) => FoodStorage.fromMapObject(food)).toList();
        }
        
      • La méthode getFoodList() récupère la liste des aliments à partir de la base de données en utilisant la requête SQL query(). La méthode query() renvoie une liste de lignes de données sous forme de liste de Map, où chaque Map représente une ligne de données avec les noms de colonnes de la table comme clés et les valeurs correspondantes comme valeurs.
      • Ensuite, cette liste est transformée en une liste d'objets FoodStorage en utilisant la méthode map() pour appliquer la fonction de conversion fromMapObject() à chaque Map dans la liste, et ensuite convertie en une liste à l'aide de toList().
    2. Données d'appel
        // Méthode pour obtenir la liste des aliments à partir de la base de données
        Future getFoodList() async {
            // Appel de la méthode getFoodList() de la classe DatabaseHelper pour obtenir la liste des aliments
            List result = await DatabaseHelper().getFoodList();
            // La méthode retourne une liste de FoodStorage, qui représente les aliments de la base de données
            // Utilisation de la méthode forEach pour parcourir chaque élément de la liste result
            // Pour chaque élément (qui est un objet FoodStorage), on appelle la méthode toMap() 
            //pour obtenir une représentation Map de l'aliment
            // Cette représentation Map est ensuite imprimée à des fins de confirmation (peut être commentée pour désactiver l'impression)
            result.forEach((FoodStorage val) => print(val.toMap()));
            
            // La méthode retourne la liste des aliments
            return result;
        }
        
    3. INSÉRER
        // Méthode pour insérer un aliment dans la base de données
        Future insertStorage(Food food) async {
            // Appel de la méthode insert de la classe Database pour insérer les données de l'aliment dans la table de la base de données
            await database.insert(foodTable, food.toMap());
            // La méthode attend la fin de l'insertion avant de se terminer
        }
        
        // Méthode pour insérer un nouvel aliment dans la base de données
        Future insertFood() async {
            // Création d'une instance de la classe DatabaseHelper pour accéder aux méthodes d'accès à la base de données
            DatabaseHelper dbHelper = DatabaseHelper();
            // Appel de la méthode insertStorage de la classe DatabaseHelper pour insérer les données d'un nouvel aliment
            // On crée un nouvel objet Food avec les détails de l'aliment à insérer
            // Ici, on insère un concombre avec une quantité de 100
            await dbHelper.insertStorage(Food(null, 'concombre', 100));
            // La méthode attend la fin de l'insertion avant de se terminer
        }
        
      • La méthode insertStorage permet d'insérer un aliment spécifié dans la base de données, tandis que la méthode insertFood insère un aliment prédéfini (dans cet exemple, un concombre avec une quantité de 100) en utilisant la méthode insertStorage de la classe DatabaseHelper.
    4. MISE À JOUR
        // Méthode pour mettre à jour les informations d'un aliment dans la base de données
        Future updateFood(Food food) async {
            // Utilisation de la méthode update de la classe Database pour mettre à jour les données de l'aliment dans la table de la base de données
            // On spécifie la table foodTable, les nouvelles données de l'aliment sous forme de map à l'aide de food.toMap(),
            // la clause WHERE pour identifier l'aliment à mettre à jour en utilisant l'ID, et les arguments de la clause WHERE (food.id)
            await database.update(foodTable, food.toMap(), where: '$colId = ?', whereArgs: [food.id]);
            // La méthode attend la fin de la mise à jour avant de se terminer
        }
      • Cette méthode permet de mettre à jour les informations d'un aliment spécifié dans la base de données en utilisant son ID comme critère de mise à jour. Les nouvelles informations de l'aliment sont passées sous forme de map avec food.toMap().
    5. SUPPRIMER
        // Méthode pour supprimer un aliment de la base de données en utilisant son ID
        Future deleteFood(int id) async {
            // Utilisation de la méthode rawDelete de la classe Database pour exécuter une requête SQL DELETE
            // On spécifie la table foodTable et la clause WHERE pour identifier l'aliment à supprimer en utilisant son ID
            await database.rawDelete('DELETE FROM $foodTable WHERE $colId = $id');
            // La méthode attend la fin de la suppression avant de se terminer
        }
    6. *Vous pouvez également écrire des instructions SQL directement en utilisant raw〇〇 comme rawDelete.