Comment gérer les opérations sur une base de données SQLite dans Flutter
Comment gérer les opérations sur une base de données SQLite dans Flutter
-
Présentation
- Dans Flutter, vous pouvez gérer les opérations sur une base de données SQLite en utilisant la bibliothèque sqflite qui fournit une interface pour interagir avec les bases de données SQLite.
- Voici comment vous pouvez gérer les opérations courantes telles que la création, la lecture, l’insertion, la mise à jour et la suppression de données dans une base de données SQLite en utilisant sqflite.
- Pour exécuter des requêtes SQL dans Flutter, le package
sqflite
propose deux approches. L’un, utilisant des requêtes brutes et l’autre, utilisant les fonctions d’assistance SQL intégrées. Les deux offrent les mêmes fonctionnalités, c’est donc au développeur de choisir celle qui convient le mieux à son style de programmation. -
Requêtes brutes (Raw SQL Queries)
-
Utilisation de Requêtes Brutes (
rawQuerie
) : - L’utilisation de requêtes brutes vous permet d’écrire directement du SQL dans votre code Dart. Cela donne une flexibilité totale, mais nécessite une attention particulière pour éviter les injections SQL.
- La méthode
rawQuery
dans le package sqflite de Flutter est utilisée pour exécuter des requêtes SQL brutes sur une base de données SQLite. Cette méthode permet d’écrire directement du code SQL dans votre application Flutter, offrant ainsi une flexibilité totale pour interagir avec la base de données. - Les requêtes brutes vous permettent d’écrire directement du code SQL dans votre application Flutter.
- Vous avez une flexibilité totale pour écrire des requêtes SQL complexes et spécifiques à votre base de données.
- Vous devez prendre des mesures pour éviter les injections SQL en vérifiant et en échappant correctement les entrées utilisateur.
- Vous avez la responsabilité de gérer la sécurité et la robustesse de vos requêtes SQL.
-
Insertion des données
- Exemple:
- Explication :
- Dans cet exemple, les valeurs de movie.id, movie.title, movie.language et movie.year sont directement insérées dans la requête SQL sans paramètres de substitution.
- Cela peut être utilisé lorsque les valeurs sont sûres et proviennent de sources de confiance pour éviter les injections SQL. Cependant, cela expose le code à des risques potentiels d’injection SQL si les valeurs ne sont pas correctement échappées ou filtrées.
-
Mise à jour des données
- Exemple:
- Explication :
- Dans cette version, la requête SQL est directement interpolée avec les valeurs des propriétés de l’objet movie. Cela évite l’utilisation de paramètres de substitution (?).
-
Suppression des données
- Exemple:
- Explication :
- Dans cette requête,
ID=${id}
utilise la variable id passée en paramètre de la fonction deleteMovie. Cela assure que la requête supprimera les enregistrements où l’ID correspond à la valeur de id fournie. -
Utilisation de Requêtes paramétrées :
- Avec les requêtes paramétrées, vous utilisez des marqueurs de paramètres dans votre requête SQL (généralement des « ? ») pour indiquer où les valeurs doivent être insérées.
- Vous fournissez ensuite les valeurs séparément, généralement sous forme de liste ou de map, lors de l’exécution de la requête.
- Cela offre une sécurité intégrée contre les injections SQL, car les valeurs sont séparées de la requête et échappées automatiquement par le moteur SQLite.
-
Récupération de données
- Exemple:
- Explication:
Future<List
: Cette méthode est définie comme une fonction asynchrone qui renvoie une liste de modèles de films (MovieModel) dans le futur.> getMovies() async { final db = await _databaseService.database;
: Cette ligne récupère une référence à la base de données en utilisant le service de base de données.var data = await db.rawQuery('SELECT * FROM Movies');
: Cette ligne exécute une requête brute SQL pour sélectionner tous les enregistrements de la table Movies dans la base de données. Les résultats de la requête sont stockés dans la variable data.List<MovieModel> movies = List.generate(data.length, (index) => MovieModel.fromJson(data[index]));
: Cette ligne génère une liste de modèles de films (MovieModel) à partir des données récupérées de la base de données. Chaque enregistrement est converti en un objet MovieModel à l’aide de la méthode fromJson.print(movies.length);
: Cette ligne affiche le nombre de films récupérés de la base de données.return movies;
: Enfin, la liste de modèles de films est renvoyée comme résultat de la méthode.-
Insertion des données
- Exemple:
- Explications:
- La méthode insertMovie prend un objet MovieModel en paramètre et insère ses données dans la table Movies de la base de données.
- Elle récupère d’abord l’instance de la base de données en appelant la méthode database de _databaseService.
- Ensuite, elle utilise la méthode rawInsert pour exécuter une requête brute (raw SQL query) qui insère les données dans la table. Les ? dans la requête sont des paramètres de substitution qui sont remplacés par les valeurs fournies dans le tableau [movie.id, movie.title, movie.language, movie.year].
- Une fois l’insertion effectuée, un message est affiché indiquant que l’insertion a été réussie, avec le résultat de l’opération.
-
Mise à jour des données
- Exemple:
- Explication :
Future<void>
: La fonction est asynchrone et ne retourne rien.editMovie(MovieModel movie)
: La fonction prend un objet MovieModel nommé movie comme paramètre, représentant les données à mettre à jour dans la base de données.final db = await _databaseService.database;
: Récupère l’instance de la base de données en utilisant le service de base de données _databaseService.var data = await db.rawUpdate(...)
: Effectue une mise à jour dans la base de données en utilisant une requête SQL brute. La méthode rawUpdate est utilisée pour exécuter une instruction SQL de mise à jour directe.'UPDATE Movies SET title=?,language=?,year=? WHERE ID=?'
: C’est la requête SQL utilisée pour mettre à jour les données dans la table Movies. Les ? sont des paramètres de substitution qui seront remplacés par les valeurs fournies dans la liste suivante.[movie.title, movie.language, movie.year, movie.id]
: Ce sont les valeurs qui remplaceront les paramètres de substitution dans la requête SQL. Elles proviennent des propriétés de l’objet movie, telles que title, language, year et id.log('updated $data');
: Un message de journalisation indiquant le nombre de lignes mises à jour est affiché. Cela donne un retour d’information sur le succès de l’opération de mise à jour.-
Suppression des données
- Exemple:
- Explication :
Future<void>
: La fonction est asynchrone et ne retourne rien.deleteMovie(String id)
: La fonction prend une chaîne de caractères id en paramètre, représentant l’identifiant du film à supprimer de la base de données.final db = await _databaseService.database;
: Récupère l’instance de la base de données en utilisant le service de base de données _databaseService.var data = await db.rawDelete('DELETE from Movies WHERE id=?', [id]);
: Supprime une entrée de la table Movies en utilisant une requête SQL brute. La méthode rawDelete est utilisée pour exécuter une instruction SQL de suppression directe.'DELETE from Movies WHERE id=?'
: C’est la requête SQL utilisée pour supprimer une entrée de la table Movies en fonction de l’identifiant spécifié. Le ? est un paramètre de substitution qui sera remplacé par la valeur fournie dans la liste suivante.[id]
: C’est la valeur qui remplacera le paramètre de substitution dans la requête SQL. Elle provient du paramètre id passé à la fonction.log('deleted $data');
: Un message de journalisation indiquant le nombre de lignes supprimées est affiché. Cela donne un retour d’information sur le succès de l’opération de suppression.-
Utilisation de Fonctions d’aide SQL intégrées (Built-in SQL Helper Functions) :
- Le package sqflite propose également des fonctions d’aide SQL qui simplifient la création de requêtes courantes, tout en protégeant contre les injections SQL.
- Ces fonctions fournies par le package sqflite simplifient la création de requêtes courantes.
- Elles offrent une protection intégrée contre les injections SQL, car elles utilisent des requêtes paramétrées pour éviter les vulnérabilités.
- Les fonctions telles que query, insert, update, delete, etc., vous permettent d’interagir avec la base de données de manière plus sûre et plus simple.
- Elles réduisent le risque d’erreurs et de failles de sécurité liées à la manipulation directe de requêtes SQL.
- Ces fonctions incluent query, insert, update, delete, etc.
-
Insertion de données :
- La fonction insert permet d’insérer des données dans une table de base de données. Elle prend en paramètre le nom de la table et un ensemble de valeurs à insérer. Voici un exemple :
- Cette méthode insère les données du film représenté par l’objet movie dans la table Movies.
-
Mise à jour de données :
- Cette méthode met à jour les données du film représenté par l’objet movie dans la table Movies en utilisant l’ID comme critère de filtrage.
-
Suppression de données :
- La fonction delete permet de supprimer des enregistrements dans une table de base de données. Elle prend en paramètre le nom de la table et une clause de filtrage. Voici un exemple :
- Cette méthode supprime les enregistrements de la table Movies ayant l’ID spécifié.
-
Récupération de données :
- La fonction query permet d’exécuter une requête SQL SELECT pour récupérer des données à partir d’une table de base de données. Elle prend en paramètre le nom de la table et éventuellement des clauses supplémentaires. Voici un exemple :
- Cette méthode récupère tous les enregistrements de la table Movies et les convertit en objets MovieModel.
Future<void> insertMovie(MovieModel movie) async {
final db = await _databaseService.database;
var data = await db.rawInsert(
'INSERT INTO Movies(id, title, language, year)
VALUES(${movie.id}, "${movie.title}", "${movie.language}", ${movie.year})');
log('inserted $data');
}
// Cette méthode met à jour un objet MovieModel dans la base de données
Future<void> editMovie(MovieModel movie) async {
// Récupération de l'instance de la base de données
final db = await _databaseService.database;
// Exécution d'une requête brute non paramétrée (raw SQL query) pour mettre à jour les données
var data = await db.rawUpdate(
// Requête SQL pour la mise à jour sans utilisation de paramètres de substitution
'UPDATE Movies SET title="${movie.title}", language="${movie.language}", year=${movie.year} WHERE ID=${movie.id}');
// Affichage d'un message indiquant que la mise à jour a été effectuée avec succès
log('updated $data');
}
Future<void> deleteMovie(String id) async {
final db = await _databaseService.database;
var data = await db.rawDelete('DELETE FROM Movies WHERE ID=${id}');
log('deleted $data');
}
Future<List<MovieModel>> getMovies() async {
final db = await _databaseService.database;
var data = await db.rawQuery('SELECT * FROM Movies');
List movies =
List.generate(data.length, (index) => MovieModel.fromJson(data[index]));
print(movies.length);
return movies;
}
Future<void> insertMovie(MovieModel movie) async {
final db = await _databaseService.database;
var data = await db.rawInsert(
'INSERT INTO Movies(id, title, language, year ) VALUES(?,?,?,?)',
[movie.id, movie.title, movie.language, movie.year]);
log('inserted $data');
}
Future<void> editMovie(MovieModel movie) async {
final db = await _databaseService.database;
var data = await db.rawUpdate(
'UPDATE Movies SET title=?,language=?,year=? WHERE ID=?',
[movie.title, movie.language, movie.year, movie.id]);
log('updated $data');
}
Future<void> deleteMovie(String id) async {
final db = await _databaseService.database;
var data = await db.rawDelete('DELETE from Movies WHERE id=?', [id]);
log('deleted $data');
}
Future insertMovie(MovieModel movie) async {
final db = await _databaseService.database;
return await db.insert('Movies', movie.toMap());
}
-
La fonction update permet de mettre à jour des enregistrements dans une table de base de données. Elle prend en paramètre le nom de la table, un ensemble de valeurs à mettre à jour et une clause de filtrage. Voici un exemple :
Future editMovie(MovieModel movie) async {
final db = await _databaseService.database;
return await db.update('Movies', movie.toMap(),
where: 'id = ?', whereArgs: [movie.id]);
}
Future deleteMovie(int id) async {
final db = await _databaseService.database;
return await db.delete('Movies', where: 'id = ?', whereArgs: [id]);
}
Future> getMovies() async {
final db = await _databaseService.database;
final List