Comment implémenter SQLite dans Flutter
Etapes de réalisation
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- Définissez "
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 FutureinitializeDatabase() 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 MaptoMap() { 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 } }
- Créez la classe
-
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(), ), ); } Futuresetting() async { DatabaseHelper.db = await DatabaseHelper.initializeDatabase();//ajouter ici return HomePage(); } } - Exécutez le processus de configuration de la base de données avant de passer au premier écran de «
Opération
CRUDSÉLECTIONNER
- Définir une méthode pour récupérer toutes les données stockées dans foodTable
- 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éthodequery()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().
// 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(); }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; }INSÉRER
- 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.
// 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 }MISE À JOUR
- 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().
// 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
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 }- *Vous pouvez également écrire des instructions SQL directement en utilisant raw〇〇 comme rawDelete.