WinRT. Utilizando SQLite.

Introducción

El SDK de WinRT al contrario que el de Windows Phone (nos facilitaba el trabajo con SQL Compact junto al uso de LINQ to SQL desde la actualización a Mango) no nos proporciona soporte directo para trabajar con base de datos locales. En la entrada actual vamos a centrarnos en como solucionar este problema utilizando SQLite para WinRT.

SQLite es un sistema de gestión de bases de datos relacional. A diferencia de los motores de base de datos convencionales con la arquitectura cliente-servidor, SQLite es independiente, ya que no se comunica con un motor de base de datos,sino que las librerías de SQLite pasan a integrar la aplicación.

Instalar el paquete SQLite para WinRT

Como siempre solemos hacer vamos a realizar un ejemplo lo más simple posible pero que nos sea válida para lograr nuestros objetivos. La plantilla selecciona para realizar el ejemplo lo más simple posible será “Blank Application”.

Lo primero que debemos hacer para poder trabajar con SQLite en nuestras aplicaciones para Windows 8 será instalar el paquete SQLite ya que por defecto SQLite no viene incluido en Windows 8. Para ello, nos dirigimos al menu Herramientas del Visual Studio. Elegimos la opción “Extensiones y actualizaciones…”:

A continuación, elegimos la opción “En línea” del menu situado a la izquierda y buscamos por la palabra “sqlite”. Seleccionaremos la opción “SQLite for Windows Runtime”:

Tras pulsar el botón “Descargar” obtendremos el paquete.

NOTA: Tras instalar el paquete para poder comenzar a utilizar debemos reiniciar Visual Studio.

Usar SQLite

Ya tenemos el paquete listo para usar. A continuación, debemos añadir la referencia a la librería en nuestro proyecto. Para ello, hacemos clic derecho sobre las referencias y seleccionamos “Añadir referencia”:

Nos aparecerá una ventana como la que puedes ver en la captura superior. Debemos elegir la opción Windows\Extensiones del menu de la izquierda. A continuación, debemos marca la opción “SQLite for Windows Runtime” junto a “Microsoft Visual C++ Runtime Package”.

Llegamos al primer gran inconveniente por ahora que tenemos al utilizar SQLite. Si pruebas a compilar en este punto verás un error como el siguiente:

¿Que ocurre?

Simple, debemos compilar el proyecto en X86, X64 o ARM para que funcione todo correctamente. Es decir, si queremos que nuestra aplicación funcione en cualquier arquitectura debemos generar un paquete por cada una de ellas.

Por último, para facilitarnos el trabajo, vamos a añadir a nuestro proyecto un pequeño Wrapper que utilizaremos para realizar llamadas a la API de SQLite llamado “sqlite-net”. Es totalmente compatible con WinRT, nos permite el uso de TPL (Task, async, await), etc.

Podemos obtener sqlite-net desde NuGet.

PM> Install-Package sqlite-net

Tras instalar sqlite-net se ños añadirán dos clases a nuestro proyecto:

  • SQLite.cs 
  • SQLiteAsync.cs

NOTA: Recomiendo echarle un vistazo al siguiente video creado por Tim Heuer donde se guia paso a paso en el proceso que acabamos de realizar (además recomiendo la visita a su blog, enormes artículos os esperan):

Ya tenemos lo necesario. Manos a la obra. Los primero que debemos hacer es preparar los datos que vamos a almacenar. En este ejemplo vamos a trabajar con libros. Por lo tanto, vamos a crear una clase Book con sus correspondientes propiedades públicadas acompañadas de distintos atrtibutos (todos definidos dentro del namespace SQLite) que nos permiten identificar al Primary Key, tipo del campo, etc:

public class Book
{
[SQLite.AutoIncrement, SQLite.PrimaryKey]
public int ID { get; set; }

[SQLite.MaxLength(256)]
public string Title { get; set; }

[SQLite.MaxLength(256)]
public string Author { get; set; }
}

Una vez preparado el tipo de información a almacenar debemos comenzar a crear nuestra base de datos SQLIte. Definimos la ruta y nombre de la base de datos (en nuestro ejemplo “books.sqlite”):

var dbPath = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "books.sqlite");

Vamos a crear la tabla de libros (Book):

using (var db = new SQLite.SQLiteConnection(dbPath))
{
     db.CreateTable<Book>();
}

Muy sencillo, hemos pasado la ruta completa donde deseamos crear la base de datos al método SQLiteConnection para crear la conexión con la base de datos. Posteriormente para crear la tabla llamamos al método CreateTable.

NOTA: Hemos utilizado en nuestro ejemplo el método CreateTable oara crear la tabla. Sin embargo, también tenemos disponible el método equivalente asíncrono CreateTableAsync.  Es algo a destacar. SQLite para Windows 8 permite utilizar TPL (es decir, Task Parallel Library: async, await, etc).

Continuamos. Llegamos a un punto clave. ¿Cómo guardamos información en la tabla que acabamos de crear?

Fácil, vamos a utilizar el método Insert pasandole instancias de nuestra tabla Book:

db.RunInTransaction(() =>
{
     db.Insert(new Book() { Title = "Windows Phone 7.5 Mango - Desarrollo Silverlight", Author = "Josué Yeray Julián" });
     db.Insert(new Book() { Title = "Trabajando en equipo con Visual Studio ALM ", Author = "Bruno Capuano" });
});

Como podéis ver en nuestro ejemplo, no estamos limitados a una única insercción por transacción.

NOTA: Al igual que en casos anteriores. Tenemos el método equivalente asíncrono en este caso para insertar InsertAsync.

Continuamos. Podemos utilizar LINQ para por ejemplo realizar consultas como el número de elementos insertados o los valores del primer o último registro insertado:

int NumBooks1 = db.Table<Book>().Count();

Sin embargo, si en determinadas ocasiones echas en falta ejecutar una consulta SQL no tenemos limitación ninguna:

int NumBooks2 = db.ExecuteScalar<int>("SELECT COUNT(ID) FROM Book");

En ambos casos obtenemos lo mismo (en nuestro ejemplo un entero de valor 2).

El método completo utilizado en nuestro pequeño ejemplo quedaría:

private async void InitDB()
{
     var dbPath = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "books.sqlite");
     using (var db = new SQLite.SQLiteConnection(dbPath))
     {
          db.CreateTable<Book>();

          db.RunInTransaction(() =>
          {
               db.Insert(new Book() { Title = "Windows Phone 7.5 Mango - Desarrollo Silverlight", Author = "Josué Yeray Julián" });
               db.Insert(new Book() { Title = "Trabajando en equipo con Visual Studio ALM ", Author = "Bruno Capuano" });
          });

          int NumBooks1 = db.Table<Book>().Count();
          int NumBooks2 = db.ExecuteScalar<int>("SELECT COUNT(ID) FROM Book");

          MessageDialog message = new MessageDialog(string.Format("Número de libros: {0}", NumBooks1));
          await message.ShowAsync();
     }
}

Puedes descargar el ejemplo realizado:

Espero que lo visto en esta entrada os sea de utilidad. En próximas entradas profundizaremos más en el asunto. También analizaremos como utilizar SQLite en Windows Phone. Cualquier duda o sugerencia podéis plantearlas en los comentarios.

Conclusiones

SQLite para Windows 8 nos aporta una correcta implementación en un área importante en la que teníamos un enorme hueco. Nos porporciona una base de datos relacional local para nuestras aplicaciones. Es Open Source y multiplataforma. Esto nos da cierta ventaja en caso de querer portar nuestra aplicación a otras plataformas móviles. Implementa muy bien TPL facilitandonos mucho el acceso a datos de manera asíncrona sin interferir en la interfaz de usuario. Por contra, no todo iba a ser positivo. Ahora mismo necesitamos generar un paquete de nuestra aplicación por cada plataforma (X64, X86 y ARM). Una vez en la Windows Store no afecta a nuestros usuarios pero si tenemos que tenerlo en cuenta de cara al desarrollo.

Más información

5 pensamientos en “WinRT. Utilizando SQLite.

  1. Una pregunta estoy desarrollando una App for WIndows 8 y estoy utilizando sqlite para la base de datos todo esta corriendo bien…lo que quisiera saber es como ejecutar una consulta como esta “select * from persona where persona.fechanacimineto = N;” algo asi consultas sql estandar…mi pregunta es como creo el comando y como la ejecuto…te agradeceria la respuesta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s