Bienvenidos sean a este post, si bien en algunos posts anteriores hemos visto como trabaja las preferencias, como poder ubicarlas en nuestro dispositivo, como guardar algunos datos, hoy nos centraremos en mas posibilidades que nos puede ofrecer preferencias mas alla de lo visto hasta ahora, comencemos viendo dos metodos para utilizar las preferencias:

Anuncios
  • getSharedPreferences, nos permite indicar de forma explicita el nombre de un archivo de preferencias por medio del parametro. Es util cuando se necesita varios archivos de preferencias o necesitas un mismo archivo entre varias actividades
  • getPreferences, no se puede indicar un nombre de archivo, se utiliza cuando se necesita un solo archivo de preferencias para una actividad

En cualquiera de los dos casos se necesita un permiso para poder acceder a las preferencias, estas son:

  • MODE_PRIVATE, acceso exclusivo
  • MODE_WORLD_READABLE, acceso de lectura
  • MODE_WORLD_WRITEABLE, acceso de lectura y escritura

Estos permisos pertenecen a la clase SharedPreferences, veamos un par de ejemplos de utilizacion, en el primer caso sera de escritura de preferencias:

SharedPreferences preferencias = getPreferences(MODE_PRIVATE);
SharedPreferences.Editor editor = preferencias.edit();
editor.putString("nombre","Martin");
editor.putInt("edad",43);
editor.commit();

Este bloque es simple, primero creamos el objeto para acceder a las preferencias, luego crearemos otro para accedeer al editor, despues por medio de este ultimo objeto y de putString() ingresaremos por ejemplo un nombre, y luego por medio de putInt() ingresaremos un valor entero, en ambos casos primero asignamos un valor que servira como clave asociado a un valor para facilitar nuestra busqueda y la ultima linea sera la encargada de subir los valores anteriores, pasemos al segundo ejemplo:

SharedPreferences preferencias = getPreferences(MODE_PRIVATE);
String nombre = preferencias.getString("nombre","valor por defecto");
int edad = preferencias.getInt("edad",-1);

Este bloque se encargara de recuperar los datos antes ingresados, primero crearemos el objeto de conexion a las preferencias y luego crearemos dos variables: una llamada nombre de tipo String para almacenar el valor guardado como nombre y luego una variable de tipo int llamada edad donde almacenaremos el valor guardado como edad, si bien usamos dos metodos distintos (getString y getInt respectivamente) los dos funcionan de la misma forma, primero informamos la clave a buscar y el segundo es un valor por defecto en caso de no encontrar un valor informado en la clave.

Anuncios

Con esto explicado pasemos a trabajar sobre un ejemplo, en este caso vayamos a Asteroides donde crearemos una nueva clase de Java, llamada AlmacenPuntuacionesPreferencias, una vez creada modificaremos su codigo con el siguiente:

package org.example.asteroides;

import android.content.Context;
import android.content.SharedPreferences;

import java.util.Vector;

public class AlmacenPuntuacionesPreferencias 
        implements AlmacenPuntuaciones {

    private static String PREFERENCIAS = "puntuaciones";
    private Context contexto;

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

    public void guardarPuntuacion(int puntos, String nombre, long fecha){

        SharedPreferences preferencias = contexto.getSharedPreferences(
                PREFERENCIAS, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = preferencias.edit();
        editor.putString("puntuacion",puntos + " " + nombre);
        editor.commit();
    }

    @Override
    public Vector<String> listaPuntuaciones(int cantidad) {
        Vector<String> resultado = new Vector<String>();
        SharedPreferences preferencias = contexto.getSharedPreferences(
                PREFERENCIAS,contexto.MODE_PRIVATE);
        String s = preferencias.getString("puntuacion","");
        if (s != "")
            resultado.add(s);
        return resultado;
    }
}

En esta clase implementaremos la posibilidad de almacenar nuestros puntajes en las preferencias que nos posibilita el sistema, primero crearemos una variable llamada PREFERENCIAS donde almacenaremos el valor puntuaciones, el cual despues usaremos como clave, despues crearemos una variable para almacenar el contexto, en nuestro constructor solamente le asignaremos el valor informado en los atributos a contexto, despues tendremos el metodo llamado guardarPuntuacion(), la cual se encargara de almacenar la puntuacion, en este caso le enviaremos tres datos, los puntos, el nombre y la fecha, luego crearemos un objeto llamado preferencias de la clase SharedPreferences, esta se encargara de decirle que debe usar el archivo puntuaciones (el valor usado paraPREFERENCIAS), en caso de no existir lo generara, y seteara la forma de acceso. Luego crearemos el editor, este es una subclase de SharedPreferences utilizado para poder editar los archivos de las preferencias, por medio del metodo edit(), nuestra siguiente linea ingresara la clave llamada puntuacion y en el campo de valor subira los puntos y el nombre, por ultimo subira los datos cargados a traves de commit(). Luego tenemos listaPuntuaciones(), el cual se encargara de recuperar los datos almacenados, primero crearemos una variable llamada resultado de tipo Vector, el cual es metodo muy similar a Array, luego crearemos otro objeto llamado preferencias para acceder a las preferencias, para luego crear una variable de tipo String llamada s donde le diremos por medio de getString() en preferencias que obtenga el valor almacenado en puntuaciones.xml, nuestro archivo creado en las preferencias, despues por medio de un condicional chequeara si s no esta vacio y lo agregara a resultado, y finalmente devolviendo el valor almacenado en resultado.

Nuestra siguiente modificacion sera en MainActivity en el metodo onCreate() donde agregaremos la siguiente linea:

almacen = new AlmacenPuntuacionesPreferencias(this);

Esta nueva linea nos permitira iniciar correctamente a nuestras preferencias para poder almacenar las puntuaciones, probamos nuestra app ahora veremos como han desaparecido los nombres creados por defecto y solo aparecera nuestro ultimo valor ingresado pero nosotros necesitamos mostrar las ultimas 10 (o mas) puntuaciones de nuestro juego pero para ello deberemos hacer una serie de modificaciones en la clase AlmacenPuntuacionesPreferencias, primero cambiaremos la siguiente linea:

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

por este bloque:

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

En esta modificacion crearemos nuestras 10 puntuaciones, para una mejor practica utilizaremos las claves puntuacion0, puntuacion1, puntuacion2…puntuacion9, pero como pueden ver el ciclo for no lo hara de forma ascendente sino de forma descendente porque iniciara con el valor 9 y hara el bucle hasta llegar a 1, y n— se encargara de restarlo por cada vuelta, luego ingresaremos la clave puntuacion sumado al valor de n, esto creara el nombre puntuacion9 por ejemplo, despues le diremos que obtenga el valor almacenado en las preferencias, en este caso tambien crearemos el nombre puntuacion junto a un numero, en caso de no encontrarlo asignara un valor vacio, una vez terminado el ciclo nos resta crear la clave puntuacion0 donde le asignaremos el puntaje y el nombre ingresado recientemente, solo nos resta una modificacion mas, para ello modificaremos este bloque:

String s = preferencias.getString("puntuacion","");
if (s != "")
    resultado.add(s);

Por este otro:

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

Este bloque se encargara de obtener las claves nombradas puntuacion0 a puntuacion9 y esta las agregara a resultado, ahora si podemos probar nuestra app como se ve en el siguiente video

Como pueden ver en el video tenemos unas puntuaciones previas, jugamos un par de veces mas para agregar mas punutaciones, y como se ve en el video ahora si podemos almacenarlas en nuestro dispositivo.

Nota: Pueden utilizar el Device File Explorer para buscar el nuevo archivo de preferencias llamado punutaciones.xml para descargarlo y analizar el mismo, tambien pueden reemplazar commit() por apply() obteniendo el mismo resultado pero de forma mas eficiente.
Anuncios

En resumen, hoy hemos visto como trabajar con shared_preferences, como podemos escribir y como leer de ellas, cuales son las formas de trabajar, hemos modificado a Asteroides para que comience a almacenar las puntuaciones, espero les haya sido util sigueme en Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00