Preferencias Compartidas

Si tu aplicación necesita guardar pocos datos, una base de datos puede resultar demasiado elaborado para ello. Para guardar datos primitivos – tales como los valores de la configuración de una aplicación: frecuencia actualización, fichero de tono de llamadas, etc – la forma mas sencilla es a través de las Preferencias Compartidas o Shared Preferences.

Preferencias Compartidas

Las preferencias compartidas no son sino pares clave-valor de datos primitivos, siendo la clave siempre una String. El valor puede ser cualquier tipo de primitivo: entero, flotante,  lógico, String…  Los datos guardados persistirán incluso aunque la aplicación se cierre.

Leer Preferencias

Para acceder a estos datos, se usa el objeto SharedPreferences, al cual tenemos acceso de dos formas diferentes:

  • getSharedPreferences (String nombreFichero, int modo): Cuando la aplicación tenga mas de un fichero de preferencias, se empleará este método para obtener el objeto con las preferencias correspondientes al fichero que queramos.
  • getPreferences (int modo): Cuando la aplicación no vaya a tener mas de un fichero de configuración, usaremos este método para obtener el único objeto de preferencias disponible.

Los modos de acceso a las Preferencias son 3, cada cual representada por su constante:

  • MODE_PRIVATE: Sólo son accesibles desde la propia aplicación.
  • MODE_WORLD_READABLE: La propia aplicación tiene permisos completos (lectura y escritura), pero las aplicaciones externas pueden leer las preferencias de la nuestra.
  • MODE_WORLD_WRITEABLE: Como el anterior, pero las aplicaciones externas también pueden realizar cambios en nuestras preferencias.

Si queremos leer alguna preferencia, tenemos que conocer su “nombre”, su clave, así como su tipo de dato. Hay un método por cada tipo de primitivo: getString, getBoolean, etc. Cada uno aceptará un parámetro de tipo String que será el nombre del campo al que queremos acceder.

 String cadena = sharedPreferences.getString("titulo_personalizado", "valor por defecto");

Si en la aplicación vamos a borrar alguna preferencia con el método remove(String nombre), podría convenir usar el método contains(String nombre) antes de los métodos para leer la preferencia. Un ejemplo:

String cadena;
if(sharedPreferences.contains("titulo_personalizado"){
     cadena = sharedPreferences.getString("titulo_personalizado", "valor por defecto");
}else{
     cadena ="campo título vacío";
} // si no se usara contains, la variable <em>cadena</em> valdría "valor por defecto".

Guardar/modificar Preferencias

Para escribir/sobreescribir preferencias, se usa el Editor, el cual se obtiene con el método edit() del objeto SharedPreferences. El editor tiene métodos para cada tipo de primitivo, tales como putString, putBoolean, etc. Dichos métodos siempre llevan dos parámetros, el nombre de la preferencia (la clave) y el valor de la misma. Un ejemplo podría ser:

editor.putInteger("volumen_reproductor", 4);

Cómo hemos comentado antes, podemos borrar preferencias con el método editor.remove(String nombre). Con editor.clear() se borrarían todas las preferencias que tuviéramos guardadas.
Cuando hayamos terminado de hacer cambios en las preferencias, deberemos llamar al método commit() del editor para guardar los cambios.

Dejo aquí un ejemplo sencillo en el que se recuperan las preferencias en una actividad normal y se guardan los cambios que se dieran. Como una de las cosas que guarda es una serie de cadenas (nombres y teléfonos de contactos), hemos de recurrir a alguna triquiñuela para convertirla en un primitivo. En este caso, hacemos uso de funciones de un proyecto librería que tengo para las utilidades dónde voy almacenando todo el código que puedo reusar. En él se encuentran las funciones por las que obtenemos los contactos así como la que nos permite “codificar” varias cadenas en una y poder luego “descodificarlas” para obtener un array.

Nota: Un proyecto librería es un proyecto “normal” que puede incluirse en otro proyecto, de modo que puedas importar las clases del que hemos designado como librería. La ventaja: Eclipse se encarga de generar el jar, actualizando en cada ejecución del proyecto principal. Podemos estar modificando clases de la librería sin problemas, con ejecutar el proyecto principal éste tendrá las clases actualizadas.
Para designar un proyecto como librería, sólo hay que ir a sus propiedades > Android y, en la parte inferior de la ventana, bajo la lista de APIs disponibles, marcarlo como librería. Para usar un proyecto-librería en uno ordinario, hay que ir al mismo sitio y pulsar Add y seleccionar de entre los proyectos que te muestra – sólo los marcados como librería – para elegir los que queremos usar.
Anuncios

4 comentarios to “Preferencias Compartidas”

  1. Buen post, tengo una pregunta, es realmente seguro guardar información sensible en preferencias compartidas con MODE_PRIVATE??

    • Por desgracia no. Hay un fallo de seguridad en los dispositivos rooteados, por ejemplo, por el cual esa información sería visible al resto de apps.
      La opción en este caso es cifrar todo aquello que guardes en MODE_PRIVATE y, además, no guardar contraseñas. O, si las vas a guardar, que estén cifradas por algún método complejo de cifrado.
      Te pongo un ejemplo: la web bancaria de ING pide DNI + contraseña para acceder. La app también, guarda el DNI la primera vez y, desde entonces, sólo te pide la contraseña. Pero te la pide siempre. El DNI es un dato sensible, pero que se puede cifrar y hacer la comprobación pertinente en servidor, de ese modo nunca se expone nada 🙂

      • Lo tendré muy en cuenta! gracias, que forma es la más aconsejable para guardar datos personales?

      • En lo posible, lo mejor es no guardarla. Que esté todo lo posible en el servidor y la sacas de allí cuando la precises. La que se tenga que guardar en el dispositivo por narices debe ser la mínima posible y, como te dije antes, encriptada con cifrados complejos. Y aún así, le daría una pensada para intentar pasar también esa al servidor.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: