Preferencias

 

 

Las preferencias (clase SharedPreferences) pueden ser usadas como un mecanismo para que los usuarios modifiquen algunos parámetos de configuración de la aplicación. Este uso fue estudiado en el capítulo 3, donde se describe como podíamos crear una actividad desdendiente de PreferenceFragment para que el usuario consulte y modifique estas preferencias.

 Las preferencias también pueden ser utilizadas como un mecanismo liviano para almacena ciertos datos que tu aplicación quiera consevar de forma permanente. Es un mecanismo sencillo que te permite almacenar una serie de variables con su nombre y su valor. Puedes almacenar variables de tipo booleano, real, enteroString. En este apartado describimos su utilización.

Las preferencias son almacenadas en ficheros xml dentro de la carpeta shared_prefs en los datos de la aplicación. Recuerda que en el capítulo 3 vimos como las preferencias de usuario siempre se almacenaban en el fichero paquete_preferences , donde paquete ha de ser reemplazado por el paquete de la aplicación (en Asteroides el fichero es org.example.asteroides_preferences). Cuando utilices las preferencias para almacenar otros valores podrás utilizar otros ficheros. Tienes dos alternativas según utilices uno de los siguientes métodos:

getSharedPreferences() Te permite indicar de forma explicita el nombre de un fichero de preferencias. Puedes utilizarlo cuando necesites varios ficheros de preferencias o acceder al mismo fichero desde varias actividades.

getPreferences() No tienes que indicar ningún nombre. Puedes utilizarlo cuando solo necesites un fichero de preferencias en la actividad.

Estos dos métodos necesitan como parámetro el tipo de permiso que queramos dar al fichero de preferencias. Los valores posibles son  MODE_PRIVATE,  MODE_WORLD_READABLE o MODE_WORLD _ WRITEABLE  según queramos tener acceso exclusive, permir la lectura o permitir lectura y escritura.

Una llamada a uno de estos dos métodos te devolverá un objeto de la clase SharedPreferences.

Para escribir las preferencias puedes utilizar el siguiente código:

 SharedPreferences preferencias= getPreferences(MODE_PRIVATE);
 SharedPreferences.Editor editor = preferencias.edit();
 editor.putString("nombre""Juan");
 editor.putInt("edad"35);
 editor.commit();

Para leer las preferencias puedes utilizar el siguiente código:

 

SharedPreferences preferencias = getPreferences(MODE_PRIVATE);

String nombre = preferencias.getString("nombre","valor por defecto");

int edad = preferencias.getInt("edad"-1);

 

El ejemplo anterior puede ser modificado  reemplazando getPreferences() por getSharedPreferences(). En este caso, tendrás que indicar el fichero donde se almacenarán las preferencias.

  video[TutorialAlmacenar información usando Preferencias

 

Ejercicio paso a paso: Almacenando la última puntuación en un fichero de preferencias.

 

Veamos un ejemplo de cómo podemos crear un fichero de preferencias para almacenar la última puntuación obtenida en Asteroides.

1.     Abre el proyecto Asteroides.

2.     Crea una nueva clase AlmacenPuntuacionesPreferencias.

3.     Reemplaza el código por el siguiente:

public class AlmacenPuntuacionesPreferencias implements AlmacenPuntuaciones {
   private static String PREFERENCIAS = "puntuaciones";
   private Context context;

   public AlmacenPuntuacionesPreferencias(Context context) {
      this.context = context;
   }

   public void guardarPuntuacion(int puntos, String nombre,
                                                long fecha) {
      SharedPreferences preferencias =context.getSharedPreferences(
            PREFERENCIAS, Context.MODE_PRIVATE);
      SharedPreferences.Editor editor = preferencias.edit();
      editor.putString("puntuacion", puntos + " " + nombre);
      editor.commit();
   }

   public Vector<String> listaPuntuaciones(int cantidad) {
      Vector<String> result = new Vector<String>();
      SharedPreferences preferencias =context.getSharedPreferences(
                              PREFERENCIAS, Context.MODE_PRIVATE);
      String s = preferencias.getString("puntuacion", "");
      if (!s.isEmpty()) {
         result.add(s);
      }
      return result;
   }
}      

 

4.     Abre el fichero Asteroides.java y modifica el método onCreate() para que la variable almacen se inicialice de  la siguiente manera:

almacen = new AlmacenPuntuacionesPreferencias(this);    

5.     Ejecuta el proyecto y verifica que la última puntuación se guarda correctamente.

6.     Pulsa el botón Android Device Monitor ( ) de la barra de herramientas y selecciona la lengüeta File Explorer. Verifica que se ha creado el fichero /data/data/org.example.asteroides/shared_prefs/puntuaciones.xml

7.     Descarga este fichero a tu ordenador (botón ) y observa su contenido.
 

Práctica: Almacenando las úlitmas 10 puntuaciones en un fichero de preferencias.

En el ejercicio anterior solo guardamos la última puntuación, lo cual no coincide con la idea que habíamos plantado en un principio, nos interesaba guardar una lista con las últimas puntuaciones. En esta práctica has de tratar de solucionar este inconveniente. NOTA: Se trata de una práctica básicamente de progragramación en Java. Si no estás interesado puedes consultar directamente la solución.

1.     Las preferencias solo están preparadas para almacenar variables de tipos simple, por lo que no permiten almacenar un vector. Para solucionar este inconveniente, te recomendamos que crees 10 preferencias con nombres puntuacion0puntuacion1, … , puntuacion9.

2.     Cuando se llame a guardarPuntuacion() almacena la nueva puntuación en puntuacion0. Pero antes ten la precaución de copiar el valor de esta preferencia a puntuacion1; y puntuacion1 apuntuacion2 y así hasta la penúltima. La última se perderá. Esta operación puede realizarse por medio de un bucle con un índice entero, n, de forma que el nombre de la preferencia a mover puedes expresarlo como “puntuacion”+n.

3.     Utiliza el mismo truco para implementar el método ListaPuntuaciones()

Solución: Almacemando las úlitmas 10 puntuaciones en un fichero de preferencias.

1.     Reemplaza en guardarPuntuacion():

editor.putString("puntuacion", puntos + " " + nombre);

   por:

for (int n = 9; n >= 1; n--) {
   editor.putString("puntuacion" + n,
               preferencias.getString("puntuacion" + (n - 1), ""));
}
editor.putString("puntuacion0", puntos + " " + nombre);

2.     Reemplara en ListaPuntuaciones():

String s = preferencias.getString("puntuacion", "");
if (!s.isEmpty()) {
   result.add(s);
}

 por:

for (int n = 0; n <= 9; n++) {
   String s = preferencias.getString("puntuacion" + n, "");
   if (!s.isEmpty()) {
      result.add(s);
   }
}