[Windows 8] Bases de datos locales en aplicaciones metro (II)

Hola a todos!

En la primera parte de esta serie sobre bases de datos locales vimos como instalar y usar SQLite en nuestras aplicaciones Metro, en esta segunda parte vamos a examinar al siguiente contendiente, SiaqoDb.

SiaqoDb

image

SiaqoDb es una base de datos manejada basada en objetos para .NET que usa Linq de forma nativa como lenguaje de consulta. No tiene soporte para sentencias SQL, lo cual esta muy bien, te aleja de la tentación de usarlas, pero si por alguna razón necesitas hacer uso de nuestro viejo amigo SQL, esta base de datos no es para ti.

Otra ventaja de SiaqoDb es su multiplataforma, al estar construida en .NET soporta Silverlight/WPF/WinForms, Windows Phone 7, Compact Framework así como Mono/MonoTouch y MonoDroid.

Consideraciones

Recientemente además han publicado una versión beta para aplicaciones Metro, si bien avisan de que no está lista para entrar en producción, es una de las primeras empresas en crear una base de datos viable y comercial para WinRT.

Una vez dicho todo esto, empecemos!

Setup

Al igual que en el caso de SQLite, SiaqoDb no viene por defecto incluida en WinRT o Windows 8 por lo que tendremos que descargarnos el componente a incluir en nuestra aplicación, al igual que SQLite o SQL Server CE estamos tratando con una base de datos “in process” con lo que no usa ningún servidor externo y la configuración debería limitarse a incluir todos los requisitos necesarios en nuestra aplicación.

Para empezar, necesitarás ir a la página de descargas de SiaqoDb y descargar la versión Beta para Windows 8 Metro, aquí

Una vez tengas el zip descargado al descomprimirlo encontraremos tres carpetas: Bin, que contiene el componente WinRT que necesitaremos añadir en nuestra aplicación, MetroExample, con un ejemplo completo y funcional de como implementar SiaqoDb y por último SiaqoDbManager, un gestor de base de datos para SiaqoDb que nos permite escribir consultas Linq y consultar nuestras bases de datos. Para iniciar esta última aplicación deberemos indicar la licencia trial que podemos solicitar en la página de descargas. Recuerda que SiaqoDb es de pago y tienes una licencia trial totalmente funcional de 30 días. Esta licencia también será necesaria cuando empecemos a usar nuestra base de datos en código como veremos a continuación.

Ahora vamos a crear un nuevo proyecto metro en Visual Studio 2012 y vamos a hacer click derecho y seleccionamos la opción “Add Reference”, en la pantalla “Reference Manager” haz click en el botón “Browse…” en la parte inferior y navega hasta el directorio Bin que acabamos de descomprimir, donde encontrarás un componente de WinRT llamado SiaqoDbWinRT.dll, selecciónalo y haz click en aceptar, a continuación ya lo tendrás listo en la pantalla de referencias y solo te quedará presionar “OK”:

image

Esta es toda la configuración que necesitamos para usar SiaqoDb en nuestro proyecto, a continuación vamos a crear nuestra base de datos.

Usando SiaqoDb

Para comenzar a trabajar con toda base de datos, lo primero que necesitamos es definir los objetos que vamos a almacenar. SiaqoDb no es una base de datos relacional al uso, con un esquema sobre el cual insertamos líneas en tablas, en lugar de esto nos permite almacenar objetos de cualquier tipo que luego podremos consultar y recuperar mediante LinQ, para ello usaremos clases decoradas con atributos que podemos encontrar en el namespace Sqo.Attributes:

  1: public class Customer
  2: {
  3:     public int OID { get; set; }
  4: 
  5:     [MaxLength(100)]
  6:     public string Name { get; set; }
  7: 
  8:     [MaxLength(256)]
  9:     public string Address { get; set; }
 10: }

Existe una particularidad a la hora de crear nuestras clases, SiaqoDb siempre busca una propiedad pública llamada OID de tipo entero de 32bits donde almacenará el identificador de objeto único, esto no evita que nosotros creemos índices adicionales, pero este siempre debe estar presente.

Y ya podemos empezar a usar nuestra base de datos, insertando nuestros objetos:

  1: private async void InitializeDb()
  2: {
  3:     SiaqodbConfigurator.SetTrialLicense("nuestro_codigo_de_licencia");
  4: 
  5:     Siaqodb db = new Siaqodb();
  6:     await db.Open(Windows.Storage.ApplicationData.Current.LocalFolder);
  7: 
  8:     Customer customer = new Customer() { Name = "Josué Yeray", Address = "Bilbao" };
  9: 
 10:     await db.StoreObject(customer);
 11:     await db.Flush();
 12:     db.Close();
 13: }

Iniciamos la base de datos indicando el directorio en el que se guardará (en este caso el directorio de datos de la aplicación) y usamos el método StoreObject para guardar instancias de nuestros objetos. Para finalizar, usamos el método Flush para escribir nuestros datos en disco y cerramos la conexión.

Si abrimos la aplicación SiaqoDbManager e indicamos la ruta de nuestra carpeta de datos, podremos ver los objetos almacenados en ella:

image

 

Si modificamos la propiedad Name o Address podremos consultarlas en nuestro código:

  1: private async void QueryDb()
  2: {
  3:     SiaqodbConfigurator.SetTrialLicense("nuestro_codigo_de_licencia");
  4: 
  5:     Siaqodb db = new Siaqodb();
  6:     await db.Open(Windows.Storage.ApplicationData.Current.LocalFolder);
  7: 
  8:     var customer = await (from Customer c in db select c).ToListAsync();
  9: 
 10:     if (customer.Any())
 11:     {
 12:         MessageDialog dlg = new MessageDialog(customer.FirstOrDefault().Name);
 13:         await dlg.ShowAsync();
 14:     }
 15: 
 16:     db.Close();
 17: }

Si ejecutamos veremos que obtenemos el resultado esperado. En este caso uso el método ToListAsync, cuando en realidad podría usar el FirstOrDefaultAsync porque este último no funciona correctamente todavía en todas las situaciones (recordemos que nos encontramos ante una beta).

image

Conclusiones

Como hemos podido ver, SiaqoDb tiene mucho potencial, es muy sencillo de usar y está muy bien planteada. Como todo, aun no es perfecta, tiene algunas cosas que debemos tener en cuenta:

  1. Es de pago, aun no sabemos los precios de WinRT (la trial de WinRT dura 90 días en vez de 30) pero de media cuesta 189$ por desarrollador y producto, esto quiere decir que si deseamos usarla en Windows Phone, WPF y Metro, tendríamos que pagar 3 licencias por cada desarrollador. Dada la calidad que aporta y el soporte que tiene detrás no creo que este sea un precio desorbitado para cualquier desarrollador freelance que gane dinero por su trabajo o cualquier empresa. Quizás es un punto de inflexión para un desarrollador solitario que esté comenzando y no tenga ingresos fijos. Aun así, creo que está justificado el coste, no me parece excesivo y es un buen producto.
  2. Multiplataforma a medias, no tenemos clientes nativos para Linux o Mac y en Android o iOS dependemos de usar Mono. Esto puede ser un problema y conlleva un gasto extra en licencias de MonoTouch y MonoDroid.

Pero en la otra cara, hay que reconocer que tiene grandes ventajas:

  1. El proceso de empezar a trabajar es mucho más sencillo que con SQLite, además el componente es nativo de WinRT por lo que no tendremos que preocuparnos de compilar distintas versiones para x64, x86 y ARM
  2. El modelo de desarrollo, haciendo uso de async / await es realmente cómodo
  3. No tenemos que preocuparnos por caracteres especiales en el path de la base de datos como ocurre en SQLite.

En definitiva, creo que SiaqoDb es, en estos momentos, la mejor base de datos que tenemos disponible para WinRT, de pago eso si, y con menos opciones de multiplataforma. Pero si estos dos aspectos no te asustan, su forma de trabajar y lo bien que está creada hacen que valga la pena y mucho. Aquí tienes como siempre el proyecto de ejemplo que hemos usado para que puedas jugar con el. En un próximo artículo intentaré realizar una comparación de rendimiento para ver cual de nuestros dos contrincantes aguanta mejor el tipo, no te lo pierdas.

Un saludo y Happy Coding!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *