Búsqueda personalizada

Blog personal para aprender a programar en Android desde cero.

viernes, 12 de marzo de 2010

Guardar preferencias

Cuando queremos que nuestra aplicación tenga unas preferencias o propiedades, tanto fijas o variables, y que se mantengan cada vez que la ejecutamos, podemos almacenar estos valores de varias formas ( Preferences, Files, Databases, y Network)

Quizás la forma más fácil y ligera es con Preferences, que es apropiada para guardar datos de tipo primitivo. La manera de guardar y recoger propiedades es del tipo clave-valor.

Incluso, es posible compartir las preferencias de nuestra aplicación con otras aplicaciones. Aunque si solamente tenemos una aplicación, o no queremos que las preferencias sean compartidas, todavía es más sencillo (el ejemplo que voy a explicar es de este tipo).

El objeto que contiene las propiedades clave-valor es del tipo SharedPreferences, que obtenemos con la llamada Activity.getPreferences(int mode).

Para guardar los cambios de nuestras propiedades usaremos un editor SharedPreferences.Editor, pero para leerlas lo haremos directamente del SharedPreferences.

Vamos con el código de ejemplo (el siguiente código no compila, es solo un trozo de código),

import android.app.Activity;
import android.content.SharedPreferences;

        public class MyActivity extends Activity {

. . .      
// En la primera llamada de la Activity recuperamos el valor de una propiedad llamada "welcomeMessage"
@Override
protected void onCreate(Bundle state){
super.onCreate(state);


                                 // Creamos el objeto SharedPreferences 
SharedPreferences settings = getSharedPreferences(MODE_PRIVATE);
// defaultMessage será el valor por defecto de nuestra propiedad
String defaultMessage = "Hola SBC";
                                // recuperamos el valor de nuestra propiedad 'welcomeMessage'
String welcomeMessage = settings.getString("welcomeMessage", defaultMessage );
myObject.setWelcomeMessage(welcomeMessage);
}


// Guardaremos las opciones en este evento, pero  podríamos hacerlo en cualquier momento
@Override
protected void onStop(){
super.onStop();

// Creamos el objecto SharedPreferences
SharedPreferences settings = getSharedPreferences(MODE_PRIVATE);
                                 // Recuperamos el editor para poder guardar
SharedPreferences.Editor editor = settings.edit();
// Recuperamos el mensaje que hemos introducido
EditText tv = (EditText) findViewById(R.id.message);
String message = tv.toString();
                                // Con el editor le asignamos un valor a nuestra propiedad 'welcomeMessage'
editor.putString("welcomeMessage", message);
      
// El commit IMPORTANTE sobre el editor
editor.commit();
}
}


Como se puede observar es bastante sencillo. Para poder compartir las preferencias con otras aplicaciones es muy similar, pero en vez de llamar a Activity.getPreferences(int mode), deberemos llamar a Context.getSharedPrefences(String my_preferences, int mode), donde mode my_preferences es el nombre identificativo.

10 comentarios:

  1. Gracias por tus entradas, son muy interesantes y me sirven para ir aprendiendo.

    Mi duda es dónde poner este código. Quizás me esté saltando algún paso antes de meterme con un menú de preferencias, pero el Eclipse se me queja, lógicamente, porque tengo dos OnCreate distintos: el "original" de mi app y el que has puesto tú. Supongo que tendrá que ver con las Activities, ¿no?

    ¿Me puedes guiar un poco? Gracias de nuevo.

    ResponderEliminar
  2. ¿Cuál es el error que te da exactamente?

    De todas formas, por encima los pasos han de ser:

    1) Guardar los datos:
    · crear el objeto SharedPreferences
    · crear el objeto Editor (SharedPreferences.Editor)
    · hacer el put de lo que queremos guardar
    2) Recuperar los datos:
    · crear el objeto SharedPreferences
    · hacer el get de lo que queremos leer

    Asegúrate de que al recuperar los datos no te falle si no encuentra nada.

    Espero que te sirva

    ResponderEliminar
  3. Me temo que estoy muy lejos de llegar a hacer lo que comentas en tus pasos.

    Me refería a que no llego ni a ejecutar la aplicación, simplemente he metido el código de tu entrada en la que estoy creando y Eclipse me ha avisado de que el método OnCreate lo tengo repetido en el mismo fichero Java.

    Por eso te decía que debo estar saltándome conceptos básicos, supongo que de las Activity.

    Saludos.

    ResponderEliminar
  4. En java, es decir que en android también, una clase no puede tener dos métodos idénticos (mismo nombre, mismos parámetros y mismo retorno).

    Deberás tener un sólo método onCreate en la Activity.

    Saludos

    ResponderEliminar
  5. Ya, por eso decía que suponía que tendría que crear otra Activity para el "programa en sí", por llamarlo de alguna manera, y otra para gestionar las preferencias de la aplicación.

    ¿Estoy en lo cierto?

    ResponderEliminar
  6. No tiene porqué. Tu puedes grabar las preferencias y recuperarlas en cualquier momento y lugar de tu aplicación (en cualquier Activity o clase normal)

    ResponderEliminar
  7. Pero no lo entiendo, porque desde la única clase (y donde está la única Activity que tengo de momento) ya tengo el OnCreate "típico", el imprescindible para ejecutar la app:

    ...
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    ...

    ¿Cómo podría hacerlo en esta misma clase si ya tengo ese método OnCreate?

    ResponderEliminar
  8. No tiene que haber ningún problema en poner el código de guardar/recuperar las preferencias dentro de ese método onCreate().¿Te da algún problema?

    Saludos

    ResponderEliminar
  9. ¿Dices de poner este código sin más?

    SharedPreferences settings = getSharedPreferences(MODE_PRIVATE);

    String defaultMessage = "Hola SBC";
    String welcomeMessage = settings.getString("welcomeMessage", defaultMessage );
    myObject.setWelcomeMessage(welcomeMessage);


    ¿Sin la cabecera de tu onCreate(Bundle state)?

    Así se me queja del myObject, que no lo tengo definido en ningún sitio (myObject cannot be resolved).

    ResponderEliminar
  10. El objeto myObject no está definido, lo de arriba sólo es un ejemplo al que se le setea el mensaje. El contenido de las preferencias, con clave "welcomeMessage", ya lo tienes en el String welcomeMessage.

    ResponderEliminar