[ES] Uso de SQLite en Windows Phone 8.1 Silverlight

Muchos me preguntáis acerca de que pasa con SQLite y las apps de Windows Phone 8.1, pero pocos venís ya sabiendo que no es lo mismo que vuestra app sea Windows Phone 8.1, por tanto usa cómo framework WinRT, o que sea Windows Phone 8.1 Silverlight, y en cuyo caso tenéis un problema.

Estas aplicaciones 8.1 Silverlight se apoyan en la versión de Windows Phone anterior(la 8) y en que sus apps eran Silverlight. De este modo comparten muchas cosas y extienden el uso de algunas otras. El problema de esto es que mucha gente no actualizó los paquetes nuget y por tanto hay librerías que no se pueden usar en 8.1 Silverlight que estaban disponibles para la versión 8.0 y entre ellas está aquella que tan agradable hacía nuestro trabajo y aplicaba Linq a SQLite.

Pero cómo ya estamos en 2014 y no podemos esperar mucho a que los propietarios de dichas librerías tengan a bien cambiar los target de sus desarrollos en nuget, hay que buscar otras soluciones. En su momento Microsoft Open Technologies creó una Portable Class Library que está en nuget y que nos cubre nuestras necesidades perfectamente.

Cómo prerrequisito tendremos que instalarnos primero de nada el SQLite Extension SDK correspondiente a nuestra plataforma, se pueden encontrar aquí. Y una vez instalado añadimos la referencia a nuestro proyecto:

2014-11-18_16-10-52

Cómo es una librería nativa, la opción “Any CPU” no está disponible a la hora de depurar, necesitaremos seleccionar la plataforma de destino: Si es nuestro emulador x86 y si es nuestro dispositivo ARM.

Ahora usaremos nuget para instalar la Portable Class Library

2014-11-18_16-28-39

Con esto tenemos todo preparado para poder utilizar la librería. Supongamos por ejemplo que queremos crear una base de datos llamada Storage.db con una tabla Personas:

Primero creamos un objecto SQLiteConnection que apunta a un archivo específico. Si no se le pasa una ruta, la librería entiende que será colocado en la ruta existente en ApplicationData.Current.LocalFolder. Hasta ahora, cómo decíamos antes, SQLite PCL sólo soporta comandos SQL directos y, por tanto, no se puede usar LINQ. Con el método Prepare definimos la consulta que queremos ejecutar y con el método Step enviamos la consulta al motor de base de datos que la ejecuta.

A continuación un ejemplo de la inserción de datos:

Igual que antes, el método Prepare se usa para definir el comando SQL. En este caso es una insert en la que definimos dos parámetros, @Nombre y @Apellido. A estos dos parámetros se les da valor llamando al método Bind y, cómo antes, Step realiza la ejecución contra la base de datos.

Además, queremos reutilizar la misma consulta sin tener que volver a realizar un Prepare porque es la misma sql la que vamos a utilizar, así que tenemos los métodos Reset que devuelve la consulta del método Prepare a su estado inicial preparada para volver a ser ejecutada y ClearBindings que elimina todos los bindings que hayan sido definidos con anterioridad.

La forma de recuperar los datos también se vuelve bastante sencilla cómo podréis comprobar:

Para leer los registros devueltos por la consulta, necesitamos iterar a través de las filas, de forma muy parecida a cómo se hacía antes con SqlDataReader.Read.

Uno de los últimos parches incluidos es que en vez de tener que hacer cast nosotros mismos al tipo de nuestras variables, podemos llamar a los métodos getBlob, getFloat, getInteger (devuelve un long) y getText pasando cómo parámetro el índice de la columna o el nombre de la misma (en consultas con joins hay que nombrar las columnas con as aunque sólo se muestren las de una tabla con tabla.* porque no se asocia el nombre directamente).

Cómo veis es una biblioteca sencilla, que nos cubre las expectativas y ofrece lo básico además de que podremos codificar contra la misma librería tanto si es Windows Phone, cómo Windows 8 o .Net 4.5.

Podréis encontrar más información acerca de la librería en Codeplex.

Pd: Este post ha nacido gracias a que el MVP Marco Minerva expuso la forma de utilizar la librería cuando esta salió y yo rescaté esa información de su blog viendo que no hay una librería propia de SQLite ya que la propuesta para Windows Phone 8.1 está basada en RT y no se ha pensado en las apps Silverlight.

Comments are closed here.