Le module Flutter permettant de gérer une base de donnée est SQFLITE (SQL Flutter Lite)
1°) Ajout de la dépendance :
Dans le fichier pubspec.yaml, ajouter sous sdk: flutter
- sqflite: avec le n° de version pour inclure SQFlite
- path_provider: ^1.6.27 pour accéder au chemin de stockage de la base de données
Ce qui donne : dependencies: flutter: sdk: flutter sqflite: ^1.3.2+2 path_provider: ^1.6.27
2°) Création des répertoires et des fichiers de paramétrage :
Sous lib, créer le répertoire database, dans database créez un fichier database_helper.dart qui va contenir les méthoses utiles pour manipuler les données de la base.
import 'dart:async';
import 'dart:io' as io;
import 'package:flutter_app_db/database/record.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart';
class DatabaseHelper {
static final DatabaseHelper _instance = new DatabaseHelper.internal();
factory DatabaseHelper() => _instance;
static Database _db;
Future<Database> get db async {
if (_db != null) return _db;
_db = await initDb();
return _db;
}
DatabaseHelper.internal();
initDb() async {
io.Directory documentsDirectory = await getApplicationDocumentsDirectory();
String path = join(documentsDirectory.path, "main.db");
var theDb = await openDatabase(path, version: 1, onCreate: _onCreate);
return theDb;
}
void _onCreate(Database db, int version) async {
// When creating the db, create the table
await db.execute(
"CREATE TABLE User(id INTEGER PRIMARY KEY, firstname TEXT, lastname TEXT, dob TEXT)");
}
Future<int> saveUser(User user) async {
var dbClient = await db;
int res = await dbClient.insert("User", user.toMap());
return res;
}
Future<List<User>> getUser() async {
var dbClient = await db;
List<Map> list = await dbClient.rawQuery('SELECT * FROM User');
List<User> employees = new List();
for (int i = 0; i < list.length; i++) {
var user =
new User(list[i]["firstname"], list[i]["lastname"], list[i]["dob"]);
user.setUserId(list[i]["id"]);
employees.add(user);
}
print(employees.length);
return employees;
}
Future<int> deleteUsers(User user) async {
var dbClient = await db;
int res =
await dbClient.rawDelete('DELETE FROM User WHERE id = ?', [user.id]);
return res;
}
Future<bool> update(User user) async {
var dbClient = await db;
int res = await dbClient.update("User", user.toMap(),
where: "id = ?", whereArgs: <int>[user.id]);
return res > 0 ? true : false;
}
}
Il est possible de déclarer plusieurs tables dans la base de données
void _createDb(Database db, int newVersion) async { await db.execute(''' create table $carTable ( $columnCarId integer primary key autoincrement, $columnCarTitle text not null )'''); await db.execute(''' create table $userTable( $userId integer primary key autoincrement, $name text not null )'''); }
Dans le répertoire database, créez un fichier record.dart qui contiendra la classe définissant un enregistrement dans la table
class User { int id; String _firstName; String _lastName; String _dob; User(this._firstName, this._lastName, this._dob); User.map(dynamic obj) { this._firstName = obj["firstname"]; this._lastName = obj["lastname"]; this._dob = obj["dob"]; } String get firstName => _firstName; String get lastName => _lastName; String get dob => _dob; Map<String, dynamic> toMap() { var map = new Map<String, dynamic>(); map["firstname"] = _firstName; map["lastname"] = _lastName; map["dob"] = _dob; return map; } void setUserId(int id) { this.id = id; } }
3°) Appel :
main.dart
avec list view list.dart
4°) Importation / édition d’une base existante :
a) méthode avec Android Studio :
Chargez dans Android Studio l’application qui a une base de données et connectez votre téléphone avec l’application installée.
- S’assurer qu’ADB est bien fonctionnel
- Open File -> Project Structure;
- In Project, select valid Project SDK;
- In Modules -> myapp_android -> Dependencies, select a valid Module SDK
- Then close AS, kill adb process in Task Manager, do
adb start-server
in command line and start AS(cf https://github.com/flutter/flutter/issues/55557
- Ouvrez Device File Explorer
- Allez dans data\data\<<Nom_de_l’application>>
- Téléchargez la base
- Editez la via un éditeur
- Puis Upload
b) Via programmation :
https://github.com/tekartik/sqflite/blob/master/sqflite/doc/opening_asset_db.md
Références :
https://www.developerlibs.com/2018/07/flutter-sqlite-database-example.html
https://www.tutorialspoint.com/flutter/flutter_database_concepts.htm