Comment implémenter SQLite dans Flutter
Comment implémenter SQLite dans Flutter
-
Etapes de réalisation
-
Configuration de
pubspec.yaml
- Définissez «
sqflite
» et «path
« . -
Création d’une base de données SQLite
- Créez la classe
DatabaseHelper
. - 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.
-
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
». -
Opération
CRUD
-
SÉ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(). -
Données d’appel
-
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.
-
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()
. -
SUPPRIMER
- *Vous pouvez également écrire des instructions SQL directement en utilisant raw〇〇 comme rawDelete.
dependencies:
flutter:
sdk: flutter
path_provider: ^2.1.0
path: ^1.6.4
sqflite: ^2.3.0
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},
);
}
}
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
}
}
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();
}
}
// 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();
}
// 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;
}
// 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
}
// 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
}
// 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
}