Almacenando y compartiendo datos en nuestra aplicación

En el mundo actual, los datos juegan un papel muy importante en nuestra vida. Una aplicación que no almacena datos útiles para el usuario pierde un potencial número de usuarios. Existen diversas formas de almacenar la información, al igual que diferentes ubicaciones donde poder guardarlos, y elegir uno u otro depende de las necesidades respecto a la información y el uso que se le vayan a dar a esos datos.

En este post vamos a tratar diversas formas de almacenar la información de nuestra aplicación.

Fichero Roaming

Se trata de un pequeño fichero de tamaño limitado, pero que se sincroniza de manera automática entre las diferentes instalaciones de tu aplicación que se hayan llevado a cabo con la misma cuenta de correo. Esta sincronización se lleva a cabo entre la aplicación de Windows y de Windows Phone a través de la Microsoft Account. Lo que significa que un usuario con la misma cuenta podrá tener sincronizados todos sus datos entres aplicaciones.

¿Y para qué nos puede resultar útil? Su funcionalidad principal es el almacenamiento de la configuración de la aplicación, ya que una vez configurada la aplicación en un dispositivo, si cambiamos de teléfono e instalamos de nuevo la aplicación, esta se sincronizará automáticamente. Esto se traduce en una comodidad para el usuario, ya que no debe estar configurando la aplicación cada vez, y una sensación de continuidad al tener todo igual sin importar el dispositivo en el que se conecte.

Es importante diferenciar entre la información del usuario y la información de la aplicación. La información del usuario consiste en información reutilizable en otras aplicaciones, y que aparte de los datos pueden ser imágenes o ficheros. Por otro lado, la información de la aplicación consiste en datos que solo tienen utilidad en la aplicación y que consisten en configuración, preferencias o el estado de la aplicación.

¿Cómo implementarlo?

Hay dos tipos de datos que podemos almacenar en este tipo de ficheros, simples y compuestos, cada uno con sus propias limitaciones de tamaño individual.

Por defecto, la ubicación en la que se encuentra este fichero es Windows.Storage.ApplicationData.Current.RoamingSettings, así que debemos empezar creando una variable que refleje esta ubicación.

1

En el caso de querer almacenar un valor simple, seguiremos el proceso de clave-valor, en el cual indicaremos un nombre para el elemento y su valor asociado.

2

Por otro lado, si queremos almacenar un dato complejo, la manera de llevar a cabo esta asignación requiere de unos pasos previos.

3

Por otro lado, también podemos almacenar ficheros de texto normales, aparte de los de configuración, los cuales también se sincronizarán siempre que no excedamos el límite de tamaño antes indicado. En caso de sobrepasar este tamaño, el fichero se almacenará y podremos acceder a él, pero no se sincronizará entre dispositivos.

3-2

Ficheros texto o binarios

En caso de querer guardar una serie de datos o de información en un fichero de texto plano, o en un fichero binario para posteriormente convertirlo a lo que necesitemos, también tenemos disponible este sistema de manera fácil y sencilla.

Para empezar, debemos indicar dónde se encuentra ubicado el fichero, ya sea para leer o para escribir. En este ejemplo vamos a realizar todo el trabajo en local, mostrando en el siguiente post otras posibles ubicaciones.

4

El siguiente paso a seguir es crear el fichero en el cual vamos a volcar la información que queramos.

5

En el apartado de CreateCollisionOption podemos indicar qué debe hacer nuestro programa en caso de que ya exista algún fichero con el mismo nombre. Las opciones principales son abrir si existe, devolver un error, sobrescribir el fichero o renombrarlo.

Posteriormente, para escribir datos en los ficheros varía su sistema dependiendo de si queremos escribir texto plano o un fichero binario.

Para escribir texto plano, basta con realizar una llamada al método correspondiente de FileIO, dependiendo de si queremos borrar todo el contenido presente en el fichero y dejar solo la nueva información, o si queremos que el nuevo texto se añada a los que ya había en el fichero.

6

En cambio, si queremos escribir un fichero binario, deberemos hacer uso de los streams y abrir el fichero con permisos de escritura.

7

Por otro lado, si queremos leer los ficheros, el proceso es muy similar.

Podemos leer un fichero de texto en bloque o línea a línea, tal y como se muestra en los ejemplos de abajo.

8

En lo referente a ficheros binarios, si empleamos un using para leer el contenido, los recursos se liberarán automáticamente cuando le corresponda, ya que implementa la interfaz IDisposable. Una vez leído el stream, ya podremos proceder a trabajar con él.

9

JSON

El almacenamiento de datos en un fichero JSON se suele realizar cuando se quiere trabajar con datos, al estar mejor estructurada la información que en un fichero de texto plano o binario.

Su manejo es sencillo, pero debemos tener en cuenta que la estructura de datos a la hora de crear uno de estos ficheros debe ser correcta para que represente lo que nosotros queremos.

Empezamos creando las clases que queremos almacenar en nuestro fichero JSON.

10 11

Con las clases anteriores, el JSON que se nos quedaría sería equivalente a:

12

Una vez hecho esto, generamos un elemento con sus datos a insertar y procedemos a serializar el elemento para posteriormente almacenarlo en el fichero. Para llevar a cabo la serialización podéis emplear alguno de los paquetes disponibles en NuGuet con el objetivo de simplificar las cosas.

13 14

 

A la hora de leer un fichero JSON, debemos comprobar que existe, y en caso afirmativo deserializar la información para así volcarla en una variable y poder trabajar con ella.

14-2

Uno de los frameworks más conocidos para trabajar con ficheros JSON es JSON.NET, el cual podéis descargar desde Codeplex o desde el gestor de paquetes NuGet

Sqlite

El uso de Sqlite nos permite almacenar los datos de nuestra aplicación de una manera más organizada, trabajando con tablas de datos, y pudiendo acceder solo a ciertos elementos con los que queramos trabajar, sin crear todos los elementos almacenados en nuestro fichero durante el proceso de lectura.

Podemos descargar el runtime desde SQLite para Windows Runtime (Windows 8.1) o SQLite para Windows Phone 8.1, dependiendo de la versión que necesitemos, o en el caso de una aplicación universal, ambos. Una vez instaladas estas extensiones, añadimos las referencias a los proyectos y a la hora de depurar, establecemos la plataforma de compilación a x86. Una vez finalizada la aplicación, si la queremos publicar ya podemos añadir las demás plataformas sin problemas.

Esto nos permite tener nuestra base de datos dentro de la aplicación, lo cual facilita mucho los procesos CRUD de los datos, a diferencia de los ficheros antes mencionados, ya que editamos un valor concreto en vez de todo el fichero.

El primer paso consiste en crear nuestra conexión con la base de datos.

15

Por si acaso no tenemos creada la base de datos, es recomendable que previamente comprobemos que existe el fichero correspondiente, para así evitar problemas la primera vez que ejecutemos la aplicación.

16

Posteriormente debemos crear el modelo de datos para nuestra aplicación, especificando si queremos alguna clave primaria o algún elemento autoincremental, entre otros, y crear nuestra tabla en la base de datos.

17 18

Tras esto, ya podemos llevar a cabo los procesos de escritura, lectura, borrado y actualización.

Para escribir datos, lo podemos hacer de un elemento individual o de una lista de elementos, tal y como podemos apreciar en las imágenes siguientes.

19 20

Por otro lado, el sistema de lectura nos permite leer directamente toda la tabla o especificar alguna línea concreta que se ajuste a los requisitos que marcamos.

21

22

En cambio, el proceso para actualizar un elemento varía un poco. Primero de todo, debemos obtener dicho elemento, y en caso de que exista, editarlo, y posteriormente mandarlo a actualizar en la base de datos.

23

Para acabar con el CRUD en Sqlite, tenemos la opción de eliminar elementos de la base de datos, para lo cual debemos comprobar que el elemento existe, para después llevar a cabo la eliminación.

24

Para terminar

Acabamos de comprobar algunas de las múltiples maneras para almacenar nuestra información. Todas son perfectamente válidas y su uso depende de qué vayamos a almacenar en ellas, desde datos de la configuración en un fichero de RoamingSettings hasta nuestro modelo de datos en un fichero de Sqlite.

Un saludo,

Josevi Agulló (@josevi_7)