Inicio Android Preferencias en Android I: Shared Preferences

Preferencias en Android I: Shared Preferences

por sgoliver

En el artículo anterior del Curso de Programación en Android vimos como construir un widget básico y prometimos dedicar un segundo artículo a comentar otras funcionalidades más avanzadas de este tipo de componentes. Sin embargo, antes de esto he decidido hacer un pequeño alto en el camino para hablar de un tema que nos será de ayuda más adelante, y no sólo para la construcción de widgets, sino para cualquier tipo de aplicación Android. Este tema es la administración de preferencias.

Las preferencias no son más que datos que una aplicación debe guardar para personalizar la experiencia del usuario, por ejemplo información personal, opciones de presentación, etc. En artículos 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 artículo.

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).

Teniedo 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:

SharedPreferences prefs =
     getSharedPreferences("MisPreferencias",Context.MODE_PRIVATE);

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:

SharedPreferences prefs =
     getSharedPreferences("MisPreferencias",Context.MODE_PRIVATE);

String correo = prefs.getString("email", "por_defecto@email.com");

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:

SharedPreferences prefs =
     getSharedPreferences("MisPreferencias",Context.MODE_PRIVATE);

SharedPreferences.Editor editor = prefs.edit();
editor.putString("email", "modificado@email.com");
editor.putString("nombre", "Prueba");
editor.commit();

¿Pero donde se almacenan estas preferencias compartidas? Como dijimos al comienzo del artículo, 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/paquete.java/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:

ddms_file_explorer_preferences

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

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="nombre">prueba</string>
    <string name="email">modificado@email.com</string>
</map>

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 determinadas opciones de nuestra aplicación sin tener que recurrir para ello a definir bases de datos SQLite, que aunque 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 artículo 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.

Puedes consultar y/o descargar el código completo de los ejemplos desarrollados en este artículo accediendo a la página del curso en GitHub.

Curso de Programación Android en PDF

Este curso también está disponible en PDF. Descubre cómo conseguirlo…

¿Te ha sido de utilidad el Curso de Programación Android? ¿Quieres colaborar de forma económica con el proyecto? Puedes contribuir con cualquier cantidad, unos céntimos, unos euros, cualquier aportación será bienvenida. Además, si tu aportación es superior a una pequeña cantidad simbólica recibirás como agradecimiento un documento con la última versión del curso disponible en formato PDF. Sea como sea, muchas gracias por colaborar!

Más información:

También te puede interesar

29 comentarios

Jesús 14/03/2011 - 19:58

Muchas gracias por el tutorial :D

Responder
taber 24/03/2011 - 0:09

Muchas gracias por el/los tutoriales.

Un enamorado de tu Blog

Responder
Ricardo Higgins 26/03/2011 - 22:47

muchas gracias por tus lecciones, las leo con placer, sos muy didactico, deberias compilarlas en un libro.
saludos por parte de los neofitos

Responder
Desarrollo en Android | sgoliver.net blog 11/04/2011 - 11:59

[…] Preferencias en Android I: SharedPreferences […]

Responder
Gonzalo Benoffi 08/06/2011 - 12:44

hola que tal?

Me quede con ganas de leer la segunda parte de esto con xml!

Estoy usando el tema de las preferencias, aun todo por codigo pero quiero hacer algo lindo con xml para q las muestre y haga el seteo…

tengo q crear el xml yo o android nos da alguna herramienta para esto? gracias!

Responder
Ficheros en Android (I): Memoria Interna | sgoliver.net blog 05/07/2011 - 12:52

[…] diversos métodos para almacenar datos en nuestras aplicaciones, como por ejemplo los ficheros de preferencias compartidas o las bases de datos SQLite. Estos mecanismos son perfectos para almacenar datos estructurados, […]

Responder
Preferencias en Android II: PreferenceActivity | sgoliver.net blog 13/10/2011 - 10:24

[…] Programación 2011-10-13 Ya hemos visto durante el curso algún artículo dedicado a las preferencias compartidas (shared preferences), un mecanismo que nos permite gestionar fácilmente las opciones de una […]

Responder
Alejandro 08/03/2012 - 16:09

Buenas,
Hace poco te compré el libro y me parece un recurso muy útil. Tengo un par de dudas sobre este tema. Mi idea es que cada vez que se abra la aplicación me pregunte si quiero activar el GPS y me lleve a la pantalla de activación si lo requiero. La cosa es que no sé que método es el que cierra la apliación para resetear este valor. No quiero que cambie cuando pasa a segundo plano ni nada, después de que android haya cerrado la aplicación porque necesitaba la memoria que este usaba.
Gracias y un saludo

Responder
Isildur Fuentes 08/09/2012 - 16:17

Genial el artículo. Gracias!!

Responder
Isaac 13/11/2012 - 12:19

hola como estas esta bueno tu blog,
pero estas preferencias funcionan para android 2.1 ?

Responder
Joan 07/01/2013 - 17:28

Buenas! Genial este blog! Muchisimas gràcias!

Un saludo,
Joan.

Responder
Alvaro Jose W 17/01/2013 - 23:22

Hola.

De antemano Lo felicito por este curso, Esta Excellent!!

En este caso solo debo anotar que la carpeta «/data/data/PAQUETE/shared_prefs…»

No puede Observarse desde un celular que no esté «ruteado».
Sería bueno que coloque la anotación en una próxima actualización del capítulo, ya que seguramente otros usuarios tan «necios» como yo van a querer revisar el archivo XML en su celular pero no van a dar con dicha carpeta…

Responder
Emanuper 21/05/2013 - 15:59

Gracias, tu curso está muy bueno.

Responder
lhbarbier 25/09/2013 - 0:28

Excelente curso, he avanzado mucho con los capítulos. Felicidades y gracias por este material de tan buena calidad.

Una pregunta, al abrirse la pantalla de Opciones, aunque la pantalla conserva los valores entre configuraciones, no muestra los valores actuales de lo seleccionado en los controles 2 y 3, sino solo al entrar a modificarlas, existe alguna forma que nos facilite ya Android de mostrar los valores seleccionados desde la pantalla de opciones sin tener que estar entrando a cada una y ver que valor tienen???

Gracias

Responder
Jordi 01/06/2014 - 9:49

Errata: «Las preferencias de una aplicación se podrían almacenar por su puesto utilizando», supuesto va junto. Saludos y gracias.

Responder
PotterChains 01/07/2014 - 15:58

Muchas gracias por este tutorial, me ha sido de mucha utilidad. :)

Responder
Pablo 10/11/2014 - 18:20

Excelente curso. Muchas gracias.
Saludos

Responder
Javier 12/02/2015 - 4:17

Hola, muchas gracias me sirvio, estoy creando algo sencillo para guardar los puntajes de un juego de android, estaba usando sqlite pero voy a probar este. Saludos.!

Responder
Curso Programación Android por Salvador Gómez – Indice de Contenidos | Miguel Moyetones 17/06/2015 - 21:25

[…] Preferencias en Android I: SharedPreferences [v3] […]

Responder
Erick Daniel Juárez GIl 23/09/2015 - 19:47

No recordaba como se hacia gracias

Responder
Omar McClellan 14/07/2016 - 16:15

Excelente aporte! simple y sencilla la explicación pero a la vez muy entendible y constructiva. Mil gracias! Éxitos mil !

Responder
juan carlos 24/12/2016 - 20:35

te amo sgoliverrrrrrrrrrr!!

Responder
Yo 10/05/2017 - 1:46

Tnks, muy útil

Responder
alby 13/12/2017 - 21:32

Que grande eres te amo wey (L)

Responder
Yago Quispe 25/10/2019 - 20:53

Muy útil y fácil de entender tu tuto, muchas gracias :3

Responder
David 25/02/2020 - 17:34

Hola,

¿Sabéis como acceder al XML que se crea?

un saludo, gracias

Responder
Raúl 17/03/2020 - 17:18

Gracias!!!!, funciono perfecto !!!!

Responder
Lesnier gonzalez 23/03/2020 - 20:40

Super….!!! asi deberian ser todas las explicaciones.

Responder

Dejar un comentario

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información. Aceptar Más Información

Política de Privacidad y Cookies