quel-est-ce-pokemon/lib/database/pokedex_database.dart

104 lines
4.3 KiB
Dart

import 'package:flutter/foundation.dart';
import 'package:sqflite_common/sqflite.dart';
import '../models/pokemon.dart';
// Permet de gérer la base de données
class PokedexDatabase {
static Database? database;
static final ValueNotifier<int> onDatabaseUpdate = ValueNotifier(0);
static Future<void> initDatabase() async {
database = await openDatabase(
"pokedex.db", // Nom de la base de données
version: 2, // Version de la base de données, permet de gérer les migrations
onUpgrade: (db, oldVersion, newVersion) async {
if (oldVersion < 2) {
await db.execute("DROP TABLE IF EXISTS pokemon");
await db.execute("CREATE TABLE pokemon (id INTEGER PRIMARY KEY NOT NULL, name TEXT NOT NULL, type1 TEXT NOT NULL, type2 TEXT, hp INTEGER NOT NULL, atk INTEGER NOT NULL, def INTEGER NOT NULL, spd INTEGER NOT NULL, description TEXT, isCaught INTEGER NOT NULL DEFAULT 0, isSeen INTEGER NOT NULL DEFAULT 0)");
}
},
onCreate: (db, version) async { // Fonction qui sera appelée lors de la création de la base de données
// Création de la table pokemon avec les colonnes...
await db.execute("CREATE TABLE IF NOT EXISTS pokemon (id INTEGER PRIMARY KEY NOT NULL, name TEXT NOT NULL, type1 TEXT NOT NULL, type2 TEXT, hp INTEGER NOT NULL, atk INTEGER NOT NULL, def INTEGER NOT NULL, spd INTEGER NOT NULL, description TEXT, isCaught INTEGER NOT NULL DEFAULT 0, isSeen INTEGER NOT NULL DEFAULT 0)");
},
);
}
// Méthode qui permet de récupérer la base de données
static Future<Database> getDatabase() async {
if (database == null) {
await initDatabase(); // On initialise la base de données si elle n'est pas encore initialisée
}
return database!;
}
// Méthode qui permet d'insérer un Pokémon dans la base de données
static Future<void> insertPokemon(Pokemon pokemon) async {
Database database = await getDatabase();
await database.insert(
'pokemon',
pokemon.toJson(),
conflictAlgorithm: ConflictAlgorithm.replace,
);
onDatabaseUpdate.value++;
}
// Méthode qui permet d'insérer plusieurs Pokémon d'un coup (plus performant)
static Future<void> batchInsertPokemon(List<Pokemon> pokemonList) async {
Database db = await getDatabase();
Batch batch = db.batch();
for (var pokemon in pokemonList) {
batch.insert(
'pokemon',
pokemon.toJson(),
conflictAlgorithm: ConflictAlgorithm.replace,
);
}
await batch.commit(noResult: true);
onDatabaseUpdate.value++;
}
// Méthode qui permet de récupérer la liste des pokémons dans la base de données
static Future<List<Pokemon>> getPokemonList() async {
Database database = await getDatabase();
var response = await database.query("pokemon");
return response.map((pokemon) => Pokemon.fromJson(pokemon)).toList();
}
// Méthode qui permet de supprimer un Pokémon de la base de données
static Future<void> deletePokemon(int id) async {
Database database = await getDatabase();
await database.delete("pokemon", where: "id = ?", whereArgs: [id]);
}
// Méthode qui permet de supprimer tous les pokémons de la base de données
static Future<void> deleteAllPokemon() async {
Database database = await getDatabase();
await database.delete("pokemon");
}
// Méthode qui permet de mettre à jour un Pokémon dans la base de données
static Future<void> updatePokemon(Pokemon pokemon) async {
Database database = await getDatabase();
await database.update("pokemon", pokemon.toJson(), where: "id = ?", whereArgs: [pokemon.id]);
onDatabaseUpdate.value++;
}
// Méthode qui permet de récupérer un Pokémon dans la base de données à partir de son ID
static Future<Pokemon?> getPokemon(int id) async {
Database database = await getDatabase();
List<Map<String, dynamic>> pokemonList = await database.query("pokemon", where: "id = ?", whereArgs: [id]);
if (pokemonList.isEmpty) {
return null;
}
return Pokemon.fromJson(pokemonList.first);
}
// Obtenir le nombre de pokémon attrapés
static Future<int> getCaughtCount() async {
Database database = await getDatabase();
var result = await database.rawQuery("SELECT COUNT(*) FROM pokemon WHERE isCaught = 1");
int count = result.isNotEmpty ? (result.first.values.first as int? ?? 0) : 0;
return count;
}
}