sábado, 29 de noviembre de 2014

Preferencias en Android



Las preferencias no son más que datos que una aplicación debe guardar de algún modo para personalizar la experiencia del usuario, por ejemplo información personal, opciones de presentación, etc. En apartados anteriores vimos ya uno de los métodos disponibles en la plataforma Android para almacenar datos, como son las bases de datos SQLite. Las preferencias de una aplicación se podrían almacenar por su puesto utilizando este método, y no tendría nada de malo, pero Android proporciona otro método alternativo diseñado específicamente para administrar este tipo de datos: las preferencias compartidas o shared preferences.
Cada preferencia se almacenará en forma de clave-valor, es decir, cada una de ellas estará compuesta por un identificador único (p.e. "email") y un valor asociado a dicho identificador (p.e. "prueba@email.com").Además, y a diferencia de SQLite, los datos no se guardan en un fichero binario de base de datos, sino en ficheros XML como veremos al final de este apartado.

La API para el manejo de estas preferencias es muy sencilla. Toda la gestión se centraliza en la clase SharedPrefences, que representará a una colección de preferencias. Una aplicación Android puede gestionar varias colecciones de preferencias, que se diferenciarán mediante un identificador único. Para obtener una referencia a una colección determinada utilizaremos el método getSharedPrefences() al que pasaremos el identificador de la colección y un modo de acceso. El modo de acceso indicará qué aplicaciones tendrán acceso a la colección de preferencias y qué operaciones tendrán permitido realizar sobre ellas. Así, tendremos tres posibilidades principales:

>MODE_PRIVATE. Sólo nuestra aplicación tiene acceso a estas preferencias.
> MODE_WORLD_READABLE. Todas las aplicaciones pueden leer estas preferencias, pero sólo la nuestra puede modificarlas.
>MODE_WORLD_WRITABLE. Todas las aplicaciones pueden leer y modificar estas preferencias.

Las dos últimas opciones son relativamente "peligrosas" por lo que en condiciones normales no deberían usarse. De hecho, se han declarado como obsoletas en la API 17 (Android 4.2).

Teniendo todo esto en cuenta, para obtener una referencia a una colección de preferencias llamada por ejemplo "MisPreferencias" y como modo de acceso exclusivo para nuestra aplicación haríamos lo siguiente:


Una vez hemos obtenido una referencia a nuestra colección de preferencias, ya podemos obtener, insertar o modificar preferencias utilizando los métodos get o put correspondientes al tipo de dato de cada preferencia. Así, por ejemplo, para obtener el valor de una preferencia llamada "email" de tipo String escribiríamos lo siguiente:


Como vemos, al método getString() le pasamos el nombre de la preferencia que queremos recuperar y un segundo parámetro con un valor por defecto. Este valor por defecto será el devuelto por el método getString() si la preferencia solicitada no existe en la colección. Además del método getString(), existen por supuesto métodos análogos para el resto de tipos de datos básicos, por ejemplo getInt(), getLong(), getFloat(), getBoolean()

Para actualizar o insertar nuevas preferencias el proceso será igual de sencillo, con la única diferencia de que la actualización o inserción no la haremos directamente sobre el objeto SharedPreferences, sino sobre su objeto de edición SharedPreferences.Editor. A este último objeto accedemos mediante el método edit() de la clase SharedPreferences. Una vez obtenida la referencia al editor, utilizaremos los métodos put correspondientes al tipo de datos de cada preferencia para actualizar/insertar su valor, por ejemplo putString(clave, valor), para actualizar una preferencia de tipo String. De forma análoga a los métodos get que ya hemos visto, tendremos disponibles métodos put para todos los tipos de datos básicos: putInt(), putFloat(), putBoolean(), etc. Finalmente, una vez actualizados/insertados todos los datos necesarios llamaremos al método commit() para confirmar los cambios. Veamos un ejemplo sencillo:


¿Pero dónde se almacenan estas preferencias compartidas? Como dijimos al comienzo del apartado, las preferencias no se almacenan en ficheros binarios como las bases de datos SQLite, sino en ficheros XML. Estos ficheros XML se almacenan en una ruta que sigue el siguiente patrón:

/data/data/paquetejava/shared_prefs/nombre_coleccion.xml

Así, por ejemplo, en nuestro caso encontraríamos nuestro fichero de preferencias en la ruta:

/data/data/net.sgoliver.android.preferences1/shared_prefs/MisPreferencias.xml

Sirva una imagen del explorador de archivos del DDMS como prueba:


Si descargamos este fichero desde el DDMS y lo abrimos con cualquier editor de texto veremos un contenido como el siguiente:


En este XML podemos observar cómo se han almacenado las dos preferencias de ejemplo que insertamos anteriormente, con sus claves y valores correspondientes.

Y nada más, así de fácil y práctico. Con esto hemos aprendido una forma sencilla de almacenar opciones de nuestra aplicación sin tener que recurrir para ello a definir bases de datos SQLite, que tampoco añaden mucha dificultad sí que requieren algo más de trabajo por nuestra parte.

Se aporta una pequeña aplicación de ejemplo para este apartado que tan sólo incluye dos botones, el primero de ellos para guardar las preferencias tal como hemos descrito, y el segundo para recuperarlas y mostrarlas en el log.

En una segunda parte de este tema dedicado a las preferencias veremos cómo Android nos ofrece otra forma de gestionar estos datos, que se integra además fácilmente con la interfaz gráfica necesaria para solicitar los datos al usuario.



Saludos compañeros, aprovechen la información.








No hay comentarios:

Publicar un comentario en la entrada