flutter-bases-datos-sqlite-hive

Almacenamiento local en Flutter: SQLite y Hive

  • 4 min

El almacenamiento local es guardar datos estructurados dentro del dispositivo del usuario.

SharedPreferences es como un post-it: genial para apuntar un teléfono, terrible para escribir una novela.

Si tu App necesita:

  • Guardar miles de registros.
  • Hacer búsquedas complejas (ej: “Usuarios mayores de 18 que vivan en Madrid”).
  • Relacionar datos (Pedidos que pertenecen a un Cliente).

Necesitas una base de datos. En Flutter podemos elegir entre soluciones relacionales, almacenes clave-valor y bases de datos orientadas a objetos. Vamos a comparar dos enfoques conocidos.

SQLite y bases de datos relacionales

SQLite es el estándar de la industria móvil. Android y iOS lo traen instalado de fábrica. Es una base de datos Relacional (SQL).

En Flutter, usamos el paquete sqflite.

¿Cómo funciona?

Piensa en hojas de cálculo de Excel (Tablas) que se relacionan entre sí. Tienes que definir un esquema estricto (CREATE TABLE…) y escribir consultas en lenguaje SQL.

  • Estándar: Si sabes SQL, sabes usarlo.
  • Relaciones: Ideal si tus datos están muy conectados (Tablas con Foreign Keys).
  • Robusto: Lleva décadas utilizándose y ofrece transacciones.
  • Más código inicial: Con sqflite hay que abrir la base, crear tablas y mapear datos.
  • Rígido: Si cambias un campo en tu modelo, tienes que hacer una “Migración” de la base de datos.
  • Solo soporta tipos básicos: No puedes guardar una List<String> directamente, tienes que convertirla.
// Ejemplo conceptual de sqflite
// 1. Escribimos SQL puro (Propenso a errores de sintaxis)
await db.execute(
  'CREATE TABLE Test (id INTEGER PRIMARY KEY, name TEXT, value INTEGER, num REAL)'
);

// 2. Insertamos mapas
await db.insert('Test', {'name': 'mi nombre', 'value': 123});

// 3. Consultamos
List<Map> list = await db.rawQuery('SELECT * FROM Test WHERE value > ?', [100]);
Copied!

Si quieres consultas tipadas, migraciones y soporte multiplataforma, Drift ofrece una capa reactiva sobre SQLite. sqflite sigue siendo útil cuando prefieres trabajar con la API y el SQL de forma más directa.

Hive como almacén clave-valor

Hive es un almacén NoSQL clave-valor escrito en Dart. Su API se parece a un Map persistente y resulta cómoda para datos que se consultan por clave.

¿Cómo funciona?

Piensa en una “Caja” (Box). Dentro de la caja puedes meter lo que quieras, asignándole una llave. Es como un Map<String, dynamic> persistente y supervitaminado.

  • Acceso directo: Puede ofrecer muy buen rendimiento en operaciones por clave, según el volumen y el dispositivo.
  • Sencillez: No hay SQL ni tablas relacionales.
  • Objetos Dart: Admite tipos básicos, listas y mapas; para clases propias debes registrar adaptadores.
  • Multiplataforma: Dispone de implementaciones para móvil, web y escritorio.
  • Sin consultas relacionales: No ofrece los JOIN y consultas ad hoc de SQL; debes diseñar índices y accesos de otra forma.
  • Evolución del esquema: Aunque no tenga tablas SQL, los cambios en objetos y adaptadores también requieren planificación y pruebas.
// Ejemplo conceptual de Hive
// 1. Abrimos una caja
var box = await Hive.openBox('testBox');

// 2. Guardamos datos (Parece un Map)
await box.put('name', 'David');
await box.put('friends', ['Ana', 'Juan', 'Pedro']); // Guarda listas directamente

// 3. Leemos
var name = box.get('name');
Copied!

Comparativa: ¿Cuál elijo?

Esta es la guía de decisión que usamos en proyectos reales:

CaracterísticaSQLite (sqflite / drift)Hive
TipoRelacional (Tablas)NoSQL (Objetos/Cajas)
Curva de aprendizajeRequiere SQL y migracionesSencilla para accesos por clave
RendimientoDepende de consultas, índices y plataformaDepende del patrón de acceso y el volumen
RelacionesPotente (JOINs)Manual
Uso idealDatos estructurados, relaciones y consultas variadas.Preferencias ampliadas, caché y acceso sencillo por clave.