w3resource

Comprehensive Guide to using SQLite in Flutter


SQLite with Flutter: A Comprehensive Guide

SQLite is a lightweight, embedded database that is perfect for mobile applications. Flutter, a popular framework for cross-platform app development, provides excellent SQLite support through packages like sqflite. This guide explores how to integrate SQLite into Flutter projects, perform CRUD operations, and manage databases efficiently.


Setting Up SQLite in a Flutter Project

Step 1: Add Dependencies

Add the sqflite and path packages to your pubspec.yaml file.

dependencies:
  sqflite: ^2.0.2
  path: ^1.8.0

Run the following command to install these dependencies:

flutter pub get

Step 2: Import Required Libraries

import 'package:sqflite/sqflite.dart'; // Provides SQLite functionality
import 'package:path/path.dart'; // Helps in managing file paths

Common SQLite Tasks in Flutter

1. Initialize the Database

Code:

// Initialize the database
Future initializeDatabase() async {
  // Get the path to the database file
  final databasePath = await getDatabasesPath();
  final path = join(databasePath, 'app_database.db');

  // Open the database and create a table if it doesn't exist
  return openDatabase(
    path,
    onCreate: (db, version) {
      // SQL query to create a table
      return db.execute(
        '''
        CREATE TABLE users (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          name TEXT NOT NULL,
          age INTEGER NOT NULL
        )
        ''',
      );
    },
    version: 1, // Define the database version
  );
}

Explanation:

  • getDatabasesPath: Retrieves the default directory for database files.
  • openDatabase: Opens or creates the database file.
  • onCreate: Executes SQL statements when the database is created for the first time.

2. Inserting Data

Code:

// Insert a user into the database
Future insertUser(Database db, String name, int age) async {
  await db.insert(
    'users', // Table name
    {'name': name, 'age': age}, // Data to insert
    conflictAlgorithm: ConflictAlgorithm.replace, // Handle conflicts
  );
}

Explanation:

  • insert: Adds a new row to the specified table.
  • ConflictAlgorithm.replace: Replaces existing rows if conflicts occur.

3. Querying Data

Code:

// Retrieve all users from the database
Future>> retrieveUsers(Database db) async {
  return await db.query('users'); // Query the users table
}

Explanation:

  • query: Retrieves rows from the specified table.
  • Returns a list of maps, where each map represents a row.

4. Updating Data

Code:

// Update a user's age by ID
Future updateUser(Database db, int id, int newAge) async {
  await db.update(
    'users', // Table name
    {'age': newAge}, // New values
    where: 'id = ?', // Specify the condition
    whereArgs: [id], // Pass the condition arguments
  );
}

Explanation:

  • update: Modifies existing rows in the table.
  • where: Specifies the condition to identify rows to update.

5. Deleting Data

Code:

// Delete a user by ID
Future deleteUser(Database db, int id) async {
  await db.delete(
    'users', // Table name
    where: 'id = ?', // Specify the condition
    whereArgs: [id], // Pass the condition arguments
  );
}

Explanation:

  • delete: Removes rows from the specified table.
  • whereArgs: Prevents SQL injection by passing parameters separately.

Using SQLite in a Flutter Application

Here is an example of integrating SQLite operations in a Flutter widget:

Code:

import 'package:flutter/material.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

class SQLiteExample extends StatefulWidget {
  @override
  _SQLiteExampleState createState() => _SQLiteExampleState();
}

class _SQLiteExampleState extends State {
  late Database database;

  @override
  void initState() {
    super.initState();
    initializeDatabase().then((db) {
      setState(() {
        database = db;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('SQLite Example')),
      body: Center(
        child: Text('SQLite in Flutter'),
      ),
    );
  }

  Future initializeDatabase() async {
    final databasePath = await getDatabasesPath();
    final path = join(databasePath, 'app_database.db');

    return openDatabase(
      path,
      onCreate: (db, version) {
        return db.execute(
          '''
          CREATE TABLE users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            name TEXT NOT NULL,
            age INTEGER NOT NULL
          )
          ''',
        );
      },
      version: 1,
    );
  }
}

Benefits of SQLite in Flutter

    1. Local Data Storage: Perfect for offline-first applications.

    2. Lightweight: Adds minimal overhead to your app.

    3. Simple API: Easy to use with the sqflite package.

    4. Cross-Platform: Works seamlessly across iOS and Android.


Conclusion

Using SQLite in Flutter apps provides an efficient way to manage data locally. By leveraging the sqflite package, developers can easily perform CRUD operations, ensuring robust data handling in their applications. Follow the examples above to get started with SQLite in your Flutter projects.

Practical Guides to SQLite Snippets and Examples.



Follow us on Facebook and Twitter for latest update.