Volver a la página principal
viernes 20 septiembre 2024
243

Cómo usar SQLite en aplicaciones móviles con Flutter

SQLite es una de las bases de datos más utilizadas en el desarrollo de aplicaciones móviles. Es ligera, rápida y no requiere un servidor externo, lo que la convierte en una opción ideal para almacenar datos de manera local. En el caso de Flutter, se integra fácilmente con esta tecnología, permitiendo a los desarrolladores crear aplicaciones robustas con una solución de base de datos completamente nativa.

En este artículo, aprenderemos cómo usar SQLite en aplicaciones móviles desarrolladas con Flutter. Exploraremos qué es SQLite, sus ventajas, y cómo implementarla en un proyecto Flutter utilizando el paquete sqflite, que es el más popular para trabajar con esta base de datos en Flutter.

¿Qué es SQLite?

SQLite es una base de datos relacional embebida que no requiere un servidor separado para funcionar. Esto significa que los datos se almacenan directamente en archivos dentro del dispositivo móvil, haciéndola ideal para aplicaciones que necesitan una base de datos ligera y autónoma. Al no tener una arquitectura cliente-servidor, reduce la complejidad y facilita la portabilidad, ya que el archivo de base de datos puede moverse de un lugar a otro fácilmente.

Algunas características clave de SQLite son:

  • Ligera: Ocupa un espacio mínimo en el dispositivo.
  • Portátil: Almacena la base de datos en un solo archivo.
  • Compatible: Funciona en todos los sistemas operativos principales, incluidos Android e iOS.
  • Transaccional: Cumple con el principio ACID (Atomicidad, Consistencia, Aislamiento y Durabilidad), lo que garantiza la integridad de los datos.

Por qué usar SQLite en Flutter

Flutter es un framework de desarrollo de aplicaciones móviles multiplataforma que permite crear aplicaciones para Android e iOS con una única base de código. Dado que muchas aplicaciones móviles requieren almacenar datos de forma local, SQLite es una excelente opción por varias razones:

1. Rendimiento: SQLite es rápido y eficiente, adecuado para aplicaciones móviles donde los recursos de hardware son limitados.

2. Simplicidad: No necesita configuración de servidor, lo que facilita su implementación en el lado cliente.

3. Persistencia de datos: Los datos almacenados en SQLite persisten incluso si la aplicación se cierra, lo que es crucial para muchas aplicaciones móviles que necesitan guardar información entre sesiones.

Instalación del paquete sqflite en Flutter

Para empezar a usar SQLite en Flutter, primero necesitamos agregar el paquete sqflite, que es el paquete más popular y completo para trabajar con SQLite en Flutter. Además, también es recomendable añadir el paquete path_provider, que nos ayudará a encontrar la ubicación adecuada para almacenar el archivo de la base de datos en el dispositivo.

Paso 1: Agregar dependencias

Abre el archivo pubspec.yaml de tu proyecto y añade las siguientes dependencias:

dependencies:
  flutter:
    sdk: flutter
  sqflite: ^2.0.0+4
  path_provider: ^2.0.9

Después de agregar las dependencias, ejecuta el siguiente comando en la terminal para instalar los paquetes:

flutter pub get

Paso 2: Crear la base de datos

Una vez que los paquetes están instalados, el siguiente paso es crear la base de datos. Para ello, utilizamos el paquete path_provider para obtener la ruta de almacenamiento de la base de datos y luego configuramos la base de datos con sqflite.

Primero, importa las dependencias necesarias en tu archivo Dart:

import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'dart:io';

Luego, crea una función para inicializar y abrir la base de datos:

Future<Database> initDB() async {
  // Obtener la ubicación de almacenamiento
  Directory documentsDirectory = await getApplicationDocumentsDirectory();
  String path = join(documentsDirectory.path, 'app_database.db');
  
  // Abrir la base de datos
  return await openDatabase(
    path,
    version: 1,
    onCreate: (Database db, int version) async {
      await db.execute(
        'CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)',
      );
    },
  );
}

Esta función realiza varias tareas:

1. Obtiene el directorio de almacenamiento adecuado para la base de datos en el dispositivo.

2. Define la ruta de almacenamiento de la base de datos, app_database.db.

3. Abre la base de datos y ejecuta una instrucción SQL para crear una tabla llamada users con tres columnas: id, name y age.

Paso 3: Insertar datos en SQLite

Con la base de datos configurada, el siguiente paso es insertar datos en ella. A continuación, mostramos cómo crear una función para insertar un nuevo usuario en la tabla users:

Future<void> insertUser(Database db, String name, int age) async {
  await db.insert(
    'users',
    {'name': name, 'age': age},
    conflictAlgorithm: ConflictAlgorithm.replace,
  );
}

Esta función toma el nombre y la edad del usuario y los inserta en la tabla users. El parámetro ConflictAlgorithm.replace asegura que si un registro con la misma clave primaria (id) ya existe, será reemplazado por el nuevo.

Paso 4: Leer datos desde SQLite

Para leer datos de la base de datos, utilizamos la función query de sqflite. Aquí te mostramos cómo obtener todos los usuarios almacenados en la base de datos:

Future<List<Map<String, dynamic>>> getUsers(Database db) async {
  return await db.query('users');
}

Esta función devuelve una lista de mapas que contienen los datos de todos los usuarios.

Paso 5: Actualizar datos en SQLite

Para actualizar un registro en la base de datos, podemos usar la función update de sqflite. Aquí mostramos cómo actualizar la edad de un usuario específico:

Future<void> updateUser(Database db, int id, int newAge) async {
  await db.update(
    'users',
    {'age': newAge},
    where: 'id = ?',
    whereArgs: [id],
  );
}

Paso 6: Eliminar datos de SQLite

Finalmente, para eliminar un registro de la base de datos, utilizamos la función delete:

Future<void> deleteUser(Database db, int id) async {
  await db.delete(
    'users',
    where: 'id = ?',
    whereArgs: [id],
  );
}

Uso de SQLite en una aplicación Flutter

Para implementar SQLite en una aplicación real, es común crear una clase de "Controlador de la Base de Datos" que gestione todas las operaciones de la base de datos como crear, leer, actualizar y eliminar (CRUD). A continuación te mostramos un ejemplo básico de cómo podría estructurarse:

class DatabaseHelper {
  static final DatabaseHelper _instance = DatabaseHelper._internal();
  static Database? _database;

  factory DatabaseHelper() {
    return _instance;
  }

  DatabaseHelper._internal();

  Future<Database> get database async {
    if (_database != null) return _database!;
    _database = await initDB();
    return _database!;
  }

  Future<Database> initDB() async {
    Directory documentsDirectory = await getApplicationDocumentsDirectory();
    String path = join(documentsDirectory.path, 'app_database.db');
    
    return await openDatabase(
      path,
      version: 1,
      onCreate: (Database db, int version) async {
        await db.execute(
          'CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)',
        );
      },
    );
  }

  Future<void> insertUser(String name, int age) async {
    final db = await database;
    await db.insert('users', {'name': name, 'age': age});
  }

  Future<List<Map<String, dynamic>>> getUsers() async {
    final db = await database;
    return await db.query('users');
  }

  Future<void> updateUser(int id, int newAge) async {
    final db = await database;
    await db.update('users', {'age': newAge}, where: 'id = ?', whereArgs: [id]);
  }

  Future<void> deleteUser(int id) async {
    final db = await database;
    await db.delete('users', where: 'id = ?', whereArgs: [id]);
  }
}

Conclusión

SQLite es una solución de base de datos perfecta para aplicaciones móviles que necesitan almacenar datos de manera local y eficiente. En Flutter, la integración con SQLite a través del paquete sqflite es sencilla y poderosa. A lo largo de este artículo hemos visto cómo configurar SQLite en un proyecto de Flutter, realizar operaciones CRUD, y cómo gestionar la base de datos de manera eficiente.

Con esta implementación, puedes crear aplicaciones móviles completas que ofrezcan una experiencia de usuario fluida y rápida al gestionar datos locales. ✌️

Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer