domingo, 9 de septiembre de 2012

Trabajando Bases de Datos locales SQLite en Windows 8

Hola a todos

Aprovechando que hoy ando trabajando por estos días con Windows 8, hoy les traigo este tema que nos hizo sufrir a más de uno mientras esperabamos el RTM, en realidad esperabamos ansiosamente el wrapper de SQLite sin saberlo.

SQLite es una biblioteca de software que implementa una en sí misma, sin servidor, sin necesidad de configuración, el motor de base de datos transaccional de SQL y su código fuente es de dominio público.

Pues bien, SQLite ahora está disponible para nuestras aplicaciones Windows 8 que requieren almacenamiento estructurado local. El dolor que teniamos es que hasta ahora no existia una implementación de un wrapper estable y aprobado por Microsoft, que nos permitiera usarlo en nuestras apps. Soy enfática en el tema de aprobado por Microsoft puesto que ya habían varias implementaciones por ahí que muchos estaban usando, sin embargo al enviar nuestras aplicaciones a ser certificadas para publicarse en el Windows Store, estas podían recibir observaciones. Sin embargo ya la librería oficial escrita en C++ y que nos provee todo el poder y funcionalidad de SQLite está disponible para nuestras apps.

A continuación voy a hacer un ejemplo sencillo, paso a paso, mostrando como usarlo en una aplicación  Windows 8, este ejemplo está basado en el artículo publicado por Tim Heuer, una de mis fuentes recurrentes.

Aclaro y soy muy enfatica en ello, de la interfaz que use en el ejemplo, nada que ver con como debería ser una aplicación Windows 8, en este caso el ejemplo está más centrado en como usar SQLite.

En primer lugar debemos instalar la extensión que nos permite usar la librería de C++ creada por el equipo de Windows. La encontramos en Tools > Extensions and Updates


Luego buscamos los componentes en línea SQLite for Windows Runtime y la descargamos para que sea instalada en nuestra máquina.


Se nos pide una confirmación, que aceptamos para proceder con la instalación.


Visual Studio nos notifica que debemos reiniciar para que la extensión sea tomada.


Reiniciamos y abrimos nuestro proyecto y seleccionamos la opción de añadir referencias.


Debemos seleccionar SQLite y Microsoft Visual C++ Runtime para que la librería funcione correctamente.


En mi caso Visual Studio reportaba un error, ya que debía seleccionar una plataforma específica a pesar de que en realidad se nombran todas las posibles en el mismo mensaje de error.


Para corregir ingresamos a las propiedades del proyecto


Y seleccionamos en la sección Build, la plataforma de destino.


Ahora bien,  en este punto si tenemos el conocimiento podríamos acceder a la librería y usarla, sin embargo lo recomendado es buscar algún Wraper existente en C# como es mi caso, para no tener que lidiar con esto si no sabemos como hacerlo. Muchos de esos wraper se encuentran disponibles en NuGet. Si usamos VB debemos continuar los pasos hasta añadir el código del wraper, y compilar una librería en C# y luego referenciar esta desde nuestro proyecto VB.

Para iniciar la instalación del wraper verificamos en las extensiones si lo tenemos instalado y si no procedemos a hacerlo igual que se hizo con el SQLite.


Ahora bien ingresamos a NuGet para buscar un wrapper adecuado para nuestra aplicación.


El wrapper recomendado en el artículo de base de este post es sqlite-net, lo seleccionamos e instalamos.


Se nos pide seleccionar en que aplicación vamos a añadir el código, en este caso solo tengo un proyecto.


Lo que sucede es que añaden dos API a nuestro código, una de ellas es una API que usa  Async , palabra que si no entiendes a este instante te recomiendo estudiar en Channel 9 o en el Blog de Walter Novoa

En este post usaré Async, si quieres ver como usar la otra API, puedes ver el post de Tim Heuer o bien leer la documentación en español del Windows Developer Center


Para esto también es muy importante tener los conceptos de objetos y ORM claros en tu cabeza. De hecho empezamos nuestro ejemplo construyendo la clase que mapea con la estructura de nuestra tabla de ejemplo. No debemos confundir la clase con la tabla, la tabla de hecho no la veremos, sin embargo es la clase quien nos ayudará a que finalmente se cree la tabla (esto solo suena enredado si no tienes claros los conceptos que te mencioné)

La clase es sencilla, sin embargo podrás ver unos decoradores sobre ella

Otros decoradores pueden ser AutoIncrement, MaxLength(30).

Ahora creamos nuestra interfaz sencilla, les comparto el Document Outline para que se guien.



Tambien pueden ver el XAML del formulario. Solo recuerden que hacer una aplicación Windows 8 requiere de mucho más, pero es bueno iniciar desde lo fácil. 

Aprovecho para recomendarles que aprendan a manejar Blend, de verdad es una gran herramienta para abstraernos un poco del arduo trabajo de hacer XAML, sin embargo es igual de importante entender y saber modifical el XAML cuando algo va mal.


Ahora va el código del botón insertar como ven es bastante sencillo de usar cuando ya tienes el wrapper correcto.


Aquí la aplicación funcionando.


Luego tenemos el botón consultar que lleva un ListView los items de la base de datos, bastante sencillo tambien.


Aqui vemos la aplicación mostrando los nombres registrados.


Recuerden que hay mucho que hacer con respecto a las listas, y en XAML si sabemos manejar los enlaces correctamente podemos mostrar más información sin hacer más código, veamos un ejemplo de esto para terminar.

Pueden modificar el DataTemplate del ListView así:


Como mostraremos todo el objeto y no solo una parte de el modificamos el código.


Y de esta forma podemos tener una lista con más forma, que de hecho podemos editar mucho mejor si usamos Expression Blend.


Espero que este corto ejemplo les resulte de mucha utilidad. Nos vemos la próxima.

Sorey

3 comentarios:

Anónimo dijo...

Buen articulo!, me das permiso de hacer un repost en mi blog sobre Windows 8?, obviamente citare tu autoría.........

Anónimo dijo...

Hola Sorey,

Hice los pasos que mencionas en tu articulo, pero cuando quiero probar, me sale el siguiente mensaje de error:

"Unable to activate Windows Store app 'XXX'. The activation request failed with error "...

*XXX es el Package name de la aplicación

Por si acaso este error solo me aparece en proyectos que intento usar Sqlite, alguna vez te salio este mensaje, si te salio, como lo solucionaste?

Atte.
-Jorge

Unknown dijo...

Hola, me agrada mucho tu articulo.. tengo una pregunta ¿Qué diferencias hay al trabajar con sqlite para una app de W8 y una de Windows form?