Usare SQLite in Flutter con sqflite
Per gestire un db SQLite in Flutter abbiamo diverse possibilità.
In questo articolo vediamo un esempio introduttivo a sqflite!
Premetto che è compatibile solo alcune piattaforme al momento:
- iOS
- Android
- macOS
Detto ciò, questi i pacchetti che dovete installare:
flutter pub add path_provider path sqflite
La prima cosa che facciamo è creare una classe helper in cui:
- creiamo una tabella al primo accesso
- creiamo due metodi (uno per l'aggiunta e uno per la lettura di tutti i records; vi lascio il resto per esercizio)
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path_provider/path_provider.dart';
class DbHelper {
static const _databaseName = "my_db.db";
static const _databaseVersion = 1;
static const table = 'persone';
static const columnId = 'id';
static const columnEmail = 'email';
late Database _db;
Future<void> init() async {
final documentsDirectory = await getApplicationDocumentsDirectory();
final path = join(documentsDirectory.path, _databaseName);
_db = await openDatabase(
path,
version: _databaseVersion,
onCreate: _onCreate,
);
}
Future _onCreate(Database db, int version) async {
await db.execute("CREATE TABLE persone (id INTEGER PRIMARY KEY, email TEXT NOT NULL)");
}
Future<List<Map<String, dynamic>>> queryAllRows() async {
return await _db.query(table);
}
Future<int> add(Map<String, dynamic> row) async {
return await _db.insert(table, row);
}
}
Poi nella nostra schermata:
import 'package:flutter/material.dart';
import 'package:test_flutter/db_helper.dart';
final dbHelper = DbHelper();
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await dbHelper.init();
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
void _add() async {
Map<String, dynamic> row = {
DbHelper.columnEmail: 'a@a.it',
};
final id = await dbHelper.add(row);
print(id);
}
void _getPersone() async {
final allRows = await dbHelper.queryAllRows();
for (final row in allRows) {
print(row.toString());
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: _add,
child: const Text('Aggiungi'),
),
ElevatedButton(
onPressed: _getPersone,
child: const Text('Leggi'),
),
],
),
),
);
}
}
In sostanza i due bottoni eseguono i due metodi, ma stampano tutto in console.
Può essere un buon esercizio mettere tutto dentro ad un widget.
Enjoy!
dart flutter sqlite sqflite
Commentami!