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
- 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.
-
Installation de la dépendance :
- Commencez par ajouter la dépendance
sqflite
à votre fichierpubspec.yaml
et exécutez flutter pub get pour installer la dépendance. -
Initialisation de la base de données :
- Avant de pouvoir effectuer des opérations sur la base de données, vous devez d’abord initialiser et ouvrir la connexion à la base de données.
- Avant de lire et d’écrire des données dans la base de données, ouvrez une connexion à la base de données. Cela implique deux étapes :
- Définissez le chemin d’accès au fichier de base de données à l’aide
getDatabasesPath()
du packagesqflite
, combiné avec la fonctionjoin
du packagepath
. - Ouvrez la base de données avec la fonction
openDatabase()
desqflite
. - Vous pouvez le faire en utilisant deux méthodes différentes.
-
Méthode 01
-
Méthode 02: (méthode Batch)
- La méthode Batch est utilisée pour exécuter un ensemble de requêtes SQL en une seule opération groupée.
- Cela peut améliorer considérablement les performances lors de l’exécution de plusieurs requêtes en une seule opération plutôt que de les exécuter individuellement.
- Cela réduit la surcharge de communication avec la base de données et peut être particulièrement utile lors de l’insertion, de la mise à jour ou de la suppression de plusieurs enregistrements à la fois.
-
Analyse du code utilisée
Future
: Cette déclaration indique que la méthode renverra un objet de typeFuture
, ce qui signifie qu’elle renverra une future instance de la base de données (ou null si la base de données n’a pas pu être initialisée).get db async
: Ceci déclare une méthode getter asynchrone appelée db. Un getter est une méthode spéciale qui permet d’accéder à la valeur d’une propriété comme si c’était une variable. Dans ce cas, la propriété db permet d’accéder à l’instance de la base de données.if (_db == null)
: Cette condition vérifie si l’instance de la base de données n’a pas encore été initialisée._db = await intialDb();
: Si l’instance de la base de données n’a pas encore été initialisée, cette ligne de code appelle la méthodeinitialDb()
pour créer et initialiser la base de données. L’opérateur await est utilisé pour attendre la résolution de cette opération asynchrone.return _db;
: Une fois que la base de données a été initialisée, elle est stockée dans la variable _db, et cette ligne renvoie cette instance de la base de données.else
: Si l’instance de la base de données a déjà été initialisée (c’est-à-dire que _db n’est pas null), cette partie du code est exécutée.return _db;
: Dans ce cas, l’instance existante de la base de données est simplement renvoyée.-
En résumé, cette méthode getter asynchrone db gère l’accès à l’instance de la base de données. Si la base de données n’a pas encore été initialisée, elle sera initialisée via la méthode
intialDb()
et l’instance résultante sera renvoyée. Si la base de données a déjà été initialisée, l’instance existante sera renvoyée. Cela permet de garantir que vous n’avez qu’une seule instance de la base de données SQLite en cours d’utilisation dans votre application. intialDb()
: C’est une méthode asynchrone qui permet d’initialiser la base de données SQLite. Elle renvoie un objet de type Database, qui représente la connexion à la base de données.String databasepath = await getDatabasesPath();
: Cette ligne obtient le chemin du répertoire où les bases de données SQLite seront stockées. La fonction getDatabasesPath() renvoie le chemin spécifique pour l’emplacement des bases de données de l’application.String path = join(databasepath , 'riadh.db');
: Ici, le chemin complet du fichier de la base de données est construit en combinant le chemin du répertoire des bases de données (databasepath) avec le nom du fichier de la base de données (riadh.db). Cela crée le chemin complet vers le fichier de la base de données.Database mydb = await openDatabase(...)
: Cette ligne utilise la fonction openDatabase fournie par la bibliothèque sqflite pour ouvrir la base de données. Elle prend plusieurs paramètres :path
: Le chemin complet vers le fichier de la base de données que nous avons construit précédemment.onCreate
: Une fonction callback qui sera appelée lors de la création initiale de la base de données (voir _onCreate dans votre code). C’est là que vous pouvez définir la structure des tables.version
: La version actuelle de la base de données. Cela est utilisé pour gérer les mises à jour de schéma.onUpgrade
: Une fonction callback qui sera appelée lorsqu’une mise à jour de schéma est nécessaire (voir _onUpgrade dans votre code). C’est là que vous pouvez gérer les changements de structure de base de données.return mydb;
: Après avoir ouvert la base de données avec openDatabase, l’objet mydb (de type Database) est renvoyé. Cela permettra à d’autres parties de votre code d’interagir avec la base de données ouverte.-
En résumé, la méthode
intialDb()
crée et ouvre une connexion à la base de données SQLite en utilisant le chemin de la base de données, déclenche la création de tables si nécessaire et renvoie l’objet Database pour interagir avec la base de données ouverte. _onCreate(Database db, int version) async
: C’est une méthode asynchrone qui prend deux paramètres :db
: Un objet de type Database, qui représente la base de données sur laquelle vous allez travailler.version
: Un entier indiquant la version de la base de données.Batch batch = db.batch();
: Ici, une instance de Batch est créée à partir de l’objet db. Un batch est généralement utilisé pour regrouper plusieurs opérations de base de données en une seule transaction, ce qui peut améliorer les performances.batch.execute(''' ... ''');
: Cette ligne exécute une requête SQL à l’intérieur de la méthode execute() sur l’objet batch. La requête SQL crée une nouvelle table appelée « notes » avec trois colonnes :-
En résumé, ce code semble être une partie d’une routine de création de base de données ou de mise à jour de schéma. Il utilise une approche asynchrone pour gérer les opérations de base de données, et il utilise un Batch pour exécuter la création de la table « notes » de manière plus efficace en regroupant les opérations en une seule transaction.
-
Opérations CRUD
dependencies:
flutter:
sdk: flutter
sqflite: ^2.0.0
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
Future openDatabase() async {
final databasePath = await getDatabasesPath();
final path = join(databasePath, 'my_database.db');
return openDatabase(path, version: 1, onCreate: _onCreate);
}
void _onCreate(Database db, int version) async {
await db.execute('''
CREATE TABLE my_table (
id INTEGER PRIMARY KEY,
name TEXT,
age INTEGER
)
''');
}
class SqlDb {
static Database? _db ;
Future get db async {
if (_db == null){
_db = await intialDb() ;
return _db ;
}else {
return _db ;
}
}
intialDb() async {
String databasepath = await getDatabasesPath() ;
String path = join(databasepath , 'riadh.db') ;
Database mydb = await openDatabase(path , onCreate: _onCreate ,
version: 3 , onUpgrade:_onUpgrade ) ;
return mydb ;
}
_onCreate(Database db , int version) async {
Batch batch = db.batch();
batch.execute('''
CREATE TABLE "notes" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"title" TEXT NOT NULL,
"note" TEXT NOT NULL
)
''') ;
await batch.commit();
// print(" onCreate =====================================") ;
}
-
« id« : Un identifiant unique auto-incrémenté.
« title« : Une colonne de texte pour le titre de la note.
« note« : Une colonne de texte pour le contenu de la note.