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.
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:
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.
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.
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
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
.
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.
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.
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],
);
}
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],
);
}
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]);
}
}
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. ✌️
Jorge García
Fullstack developer