En este post te enseñaré a usar Flutter con SQLite en varias plataformas, excepto la web. El paquete oficial soporta solo Android, iOS y MacOS, pero no Windows ni Linux.
Aquí veremos cómo usar SQLite con Flutter en Android, iOS, MacOS, Windows y Linux usando un paquete adicional llamado sqflite_ffi
que es compatible con Linux y Windows.
Nota: si tú solo quieres usar SQLite en Android, iOS o MacOS entonces tal vez quieras buscar un tutorial más simple como este, ya que aquí enseño a cómo tener SQLite en la mayor cantidad de plataformas posibles.
Agregando dependencias
Primero puse las dependencias sqlite
y path
en dependencies
:
Siguiendo las instrucciones de sqflite_ffi https://github.com/tekartik/sqflite/blob/master/sqflite_common_ffi/doc/using_ffi_instead_of_sqflite.md agregué sqflite_common_ffi
a las dev_dependencies
:
Por el momento no sé cuál es la diferencia entre las dev_dependencies
y dependencies
específicamente en Flutter, ya que al mover sqflite_common_ffi
me dio algunos problemas en Windows y lo dejé en dev_dependencies
.
Ejemplo
Yo te mostraré un ejemplo muy sucio y poco optimizado, pero que te mostrará cómo trabajar con SQLite en varias plataformas con Flutter.
Estoy importando las siguientes librerías:
Y en la función que obtiene la base de datos estoy comprobando si estoy en Windows o Linux para invocar a sqfliteFfiInit(); además de invocar a openDatabase según la plataforma.
Fíjate en que al final obtendremos una variable de tipo Database, así que más adelante podríamos tener una función que obtiene la base de datos sin importar plataforma:
Te repito que es un ejemplo muy sucio, modificado de otros ejemplos y todo eso. Lo que quiero que notes es que estamos comprobando en cuál plataforma estamos y además obteniendo la ruta de las bases de datos.
En Windows y Linux no existirá getDatabasesPath
así que simplemente utilizo el directorio actual, pero como en iOS y Android sí existe entonces debo invocar a esa función.
Obviamente falta optimizar, poner constantes y todo eso. Para probar usé el siguiente código que de nuevo es copiado de por ahí:
En este caso estoy creando la tabla (cosa que debería ser en el onCreate, pero te repito que es un ejemplo), insertando, obteniendo e imprimiendo resultados de la consulta.
Código completo
Te mostraré mi main.dart
que tiene la función que prueba a SQLite y además una función que se invoca al presionar el botón y que muestra los resultados de la consulta en un SnackBar:
Fíjate a partir de la línea 152.
Compilando para producción
Para probar que todo funcione, yo compilé para Windows y para Android. En Android no tuve ningún problema y todo funcionó perfectamente:

En Windows primero no funcionaba pero es porque hay que colocar y distribuir el DLL de SQLite junto con el ejecutable.
Lo descargué de https://www.sqlite.org/download.html, el zip sqlite-dll-win64-x64-3390300.zip
y extrajo sqlite3.dll
. Obviamente en el futuro aparecerán actualizaciones.

Lo único en lo que me quedan dudas es en la versión, no sé cuál versión utiliza el paquete, pero me imagino que basta con tener la última versión.
Nota: el archivo SQLite se crea dentro de .dart_tool\sqflite_common_ffi\databases
.
Poniendo todo junto
Te dejo los programas de prueba (Android y Windows) en el repositorio de GitHub junto con el código completo para que puedas probar y descargar las demostraciones.
Para terminar te dejo con más tutoriales de Flutter en mi blog.