Preferencias en Android: Shared Preferences

Tiempo estimado de lectura: 4 min.

Las preferencias no son más que datos que se guardan para ser compartidos con otros métodos y/o actividades.

En Android hay varias maneras de almacenar datos: Puedes hacerlo a través de una base de datos local y/o remota, a través de las Shared Preferences o combinar ambas formas.

Normalmente se usan para almacenar información personal, opciones de presentación, etc. La limitación la ponemos nosotros, ya que está en la imaginación del propio diseñador de la aplicación.

Lo interesante de todo esto es que ese valor seguirá siendo recordado a pesar de cerrar nuestra aplicación o de incluso reiniciar o apagar nuestro móvil 😉 .

La gestión de estas preferencias se centraliza en la clase SharedPreferences, que representa una colección de preferencias. A la hora de instanciarlas, estas tienen un identificador, que es la clave o nombre que le hayamos puesto nosotros, y un modo de acceso:

  • MODE_PRIVATE: Nuestra aplicación tiene acceso a estas preferencias.
  • MODE_WORLD_READABLE: Todas las aplicaciones tienen acceso en modo lectura a estas preferencias, pero únicamente nuestra aplicación puede modificarlas.
  • MODE_WORLD_WRITABLE: Todas las aplicaciones pueden leer y escribir sobre estas preferencias.

No es recomendable usar las dos últimas opciones. Ten en cuenta que han sido declaradas obsoletas desde la API 17 (correspondiente a Android 4.2).

Pero, ¡basta ya de teoría y vamos a lo que nos interesa!

Obteniendo valores de las preferencias

Para hacer una llamada a nuestras preferencias, debes incluír el siguiente código:

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

Una vez referenciada nuestra colección de preferencias, ahora podemos obtener sus valores mediante el método get y escribir mediante el método put.

Por ejemplo, para obtener el valor de una preferencia llamada “url” de tipo String deberíamos poner lo siguiente:

String url = prefs.getString("url", "www.google.com");

Con esto le estamos diciendo que obtenga en valor de la preferencia “url” o, si estuviese vacío, obtuviese el valor por defecto, que en este caso es “www.google.com”.

También podríamos haber hecho lo siguiente:

String url = prefs.getString("url", "");

En el cual el valor por defecto estaría vacío.

Ten en cuenta que también admiten otros métodos para el resto de tipos de datos básicos, como son:

  • getBoolean()
  • getInt()
  • getFloat()
  • getLong()

Escribiendo valores en las preferencias

Para insertar un valor o actualizarlo, hay que hacerlo utilizando el objeto SharedPreferences.Editor.

Una vez referenciado el editor, se ha de realizar un put sobre el tipo de dato básico correspondiente y validamos mediante el método commit(). Siguiendo el ejemplo de la URL:

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

SharedPreferences.Editor editor = prefs.edit();

editor.putString("url", "www.saulcintero.com");
editor.commit();

Y de esta manera hemos creado el valor, si no existía, o actualizado su contenido a “www.saulcintero.com” dentro de la preferencia “url”.

Ahora imagina que en vez de tipos de valores individuales, necesitas crear un array de objetos en tus Shared Preference. ¿Qué harías?

Bueno, en respuesta a eso encontré en Stack Overflow un mensaje que explicaba cómo hacerlo sin dependencia de una API en una versión en concreto. Aquí te dejo los dos métodos que hacen falta para realizar esto:

[Salvar el array]

public boolean saveArray(String[] array, String arrayName, Context mContext) {
    SharedPreferences prefs = mContext.getSharedPreferences("preferencename", 0);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putInt(arrayName +"_size", array.length);
    for(int i=0;i<array.length;i++)
        editor.putString(arrayName + "_" + i, array[i]);
    return editor.commit();
}

[Recuperar el array]

public String[] loadArray(String arrayName, Context mContext)
{
    SharedPreferences prefs = mContext.getSharedPreferences("preferencename", 0);
    int size = prefs.getInt(arrayName + "_size", 0);
    String array[] = new String[size];
    for(int i=0;i<size;i++)
        array[i] = prefs.getString(arrayName + "_" + i, null);
    return array;
}

Y si quieres puedes añadirlo dentro de una librería propia o en alguna clase a la que el resto tengan acceso.

Fácil, ¿verdad? Eso es lo bonito, que no todo tiene por qué ser siempre complicado en esta vida 🙂 .

Funcionamiento interno

Y seguramente te estés preguntando: “¿Pero esto qué es?… ¿¡Magia!?“.

Bueno, a veces nuestra labor es que lo parezca, pero los desarrolladores no somos magos, si no ilusionistas. ¡Unos artistas de la farándula!

Y después de demostrar que parezca que no tenga abuela, la respuesta a la sección es que toda esta información se guarda en XML’s.

Puedes comprobarlo dentro del siguiente path:

/data/data/nombre.del.paquete/shared_prefs/nombre.de.la.colección.xml

Si utilizas Eclipse, dentro de la perspectiva DDMS, pestaña File Explorer, podrás acceder al contenido de esa carpeta y verás el fichero MyPreferences.xml. Desde ahí puedes decargarlo al PC y, si lo analizas, verás lo siguiente:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="url">www.saulcintero.com</string>
</map>

Ahora ya lo entiendes mejor, ¿verdad?

Espero que te sea de ayuda en tus proyectos. ¡Yeah! 🙂

Saúl Cintero.

Publicado por

Saúl Cintero

Saúl Cintero

Soy feliz diseñando y desarrollando soluciones para cada necesidad.En los últimos tiempos he centrado mi atención en Java y disfruto desarrollando productos tanto para escritorio como para dispositivos móviles.

Deja un comentario

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

Time limit is exhausted. Please reload CAPTCHA.