Dependencias básicas al utilizar SQLite en una aplicación de Xamarin Forms

Por regla general, las aplicaciones empresariales móviles suelen almacenar localmente cierta cantidad de datos. Aunque para algunos contextos es suficiente la capacidad nativa de almacenar información en la forma de pares clave-valor, muchas veces se necesita la funcionalidad que ofrece una base de datos SQL. En el mundo móvil, base de datos SQL multiplataforma es sinónimo de SQLite.

Cuando creamos una solución multiplataforma* con Xamarin Forms que debe hacer uso de SQLite, es necesario agregar una serie de paquetes y extensiones. He pensado que tener a mano la lista de esas dependencias nos será de utilidad cada vez que iniciemos un proyecto de tales características. Así, no la tendremos que memorizar ni deducirla de algún proyecto anterior, con lo que aceleraremos este paso del desarrollo. Veamos a continuación un resumen de las dependencias mínimas que debemos instalar.

Paquetes de NuGet

Deberemos agregar los siguientes paquetes de NuGet en todos los proyectos de la solución:

Paquetes de NuGet

SQLite.Net.Async-PCL
Extensiones asíncronas del paquete SQLite.Net-PCL.

SQLite.Net.Core-PCL
Se instala automáticamente como dependencia del anterior.

SQLite.Net-PCL
Exporta las clases SQLite.Net.Platform.XamarinAndroid.SQLitePlatformAndroid, SQLite.Net.Platform.XamarinIOS.SQLitePlatformIOS y SQLite.Net.Platform.WinRT.SQLitePlatformWinRT, entre otras. Estas clases implementan la interfaz SQLite.Net.Interop.ISQLitePlatform. Por ejemplo, en la PCL tendríamos el código multiplataforma de la clase repositorio:

        public Repository(ISQLitePlatform sqlitePlatform)
        {
            if (Connection == null)
            {
                var connectionFunc = new Func<SQLiteConnectionWithLock>(() =>
                    new SQLiteConnectionWithLock
                    (
                        sqlitePlatform,
                        new SQLiteConnectionString(dbPath, storeDateTimeAsTicks: false)
                    ));

                Connection = new SQLiteAsyncConnection(connectionFunc);
            }
        }

Este constructor recibe la implementación específica de cada plataforma de la interfaz ISQLitePlatform.

Es conveniente incluir también el paquete PCLStorage, ya que nos permite acceder de forma transparente a la ubicación física del archivo de la base de datos, independientemente de la plataforma de destino. Su utilidad se hace efectiva cuando necesitamos inicializar la ubicación de dicho archivo en el proyecto de PCL:

string dbPath = System.IO.Path.Combine(PCLStorage.FileSystem.Current.LocalStorage.Path, "mydatabase.db3");
Extensiones de Visual Studio

SQLite existe de forma nativa en iOS y Android, pero en el caso de la familia Windows, debemos agregarlo manualmente a los diferentes proyectos.

Windows 8.1
Añadir una referencia al paquete de extensión de Visual Studio SQLite for Windows Runtime (Windows 8.1).

SQLite for Windows Runtime (Windows 8.1)

Windows Phone 8.1
Añadir una referencia al paquete de extensión de Visual Studio SQLite for Windows Phone 8.1.

SQLite for Windows Phone 8.1

UWP
Añadir una referencia al paquete de extensión de Visual Studio SQLite for Universal Windows Platform.

Si establecemos el proyecto de UWP como proyecto de inicio, es muy probable que al ejecutar la solución se lance una excepción como la siguiente:

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. —> System.DllNotFoundException: Unable to load DLL ‘sqlite3’: The specified module could not be found. (Exception from HRESULT: 0x8007007E)
at SQLite.Net.Platform.WinRT.SQLite3.SetDirectory(UInt32 directoryType, String directoryPath)
at SQLite.Net.Platform.WinRT.SQLiteApiWinRT..ctor()
at SQLite.Net.Platform.WinRT.SQLitePlatformWinRT..ctor()
— End of inner exception stack trace —

Si añadimos una referencia a Visual C++ 2015 Runtime for Universal Windows Platform Apps, el problema debería resolverse.

SQLite for Universal Windows Platform

En esta entrada he querido presentar una lista de las dependencias básicas (paquetes y extensiones), que debemos tener en cuenta al crear una aplicación multiplataforma* con Xamarin Forms que requiera la utilización de SQLite. No dudes en comentar cualquier idea, sugerencia o corrección que contribuya a mejorar este resumen.

*Por multiplataforma he asumido iOS, Android, Windows 8.1, Windows Phone 8.1 y UWP.

ACTUALIZACIÓN 05/05/2016:
SQLite estará incluído en Windows 10 Anniversary edition como parte de la Universal Windows Platform (UWP) y se recomienda para todas las necesidades de almacenamiento de datos locales en esta plataforma.

Enlaces de interés:

SQLite.Net-PCL
https://github.com/oysteinkrog/SQLite.Net-PCL

PCL Storage
https://github.com/dsplaisted/PCLStorage

SQLite for Windows Runtime (Windows 8.1)
https://visualstudiogallery.msdn.microsoft.com/1d04f82f-2fe9-4727-a2f9-a2db127ddc9a

SQLite for Windows Phone 8.1
https://visualstudiogallery.msdn.microsoft.com/5d97faf6-39e3-4048-a0bc-adde2af75d1b

SQLite for Universal Windows Platform
https://visualstudiogallery.msdn.microsoft.com/4913e7d5-96c9-4dde-a1a1-69820d615936