Usare SQLite in Flutter con sqflite

Mattepuffo's logo
Usare SQLite in Flutter con sqflite

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!


Condividi

Commentami!