Cómo guardar datos en Android: SharedPreferences

Buenas, la última semana vimos la segunda parte de la personalización de controles, el cual lo utilizábamos para rellenar una lista. Los datos que usábamos eran en duro, no sobre un origen de datos. A partir de una serie de artículos vamos a ver como darle persistencia a nuestros.




Principalmente veremos tres formas distintas:
  1. Shared preferences, utilizadas para guardar sobre todo datos de configuración.
  2. Base de datos, almacenará las entidades de nuestra aplicación: usuarios, coches, libros, recetas. Vamos, lo que se suele guardar en cualquier base de datos.
  3. Sistema de archivos, almacenaremos cualquier tipo de archivo, de música, video, pdf...
Las Shared Preferences se gestionan con la clase SharedPreferences incluidas en el núcleo de Android. Se guardan en un archivo XML en forma de clave-valor, y se guardan en el sistema de archivos de la siguiente forma:
/data/data/com.namespace.de.nuestra.aplicacion/shared_prefs/nombre_de_nuestras_prefs.xml

Una vez dicho esto vamos a ponernos manos a la obra. Las primeras veces que trabaje con esto lo hacía en el trozo de código que quería obtener o escribir mis datos, ya que la aplicación que estaba haciendo era muy pequeña, pero aunque sea muy pequeña la aplicación, lo mejor es llevarse toda la funcionalidad a una clase aparte. Para ello en el espacio de nombres o package (com.examples.holamundo siguiendo con la aplicación holamundo) de nuestra aplicación hacemos botón derecho con el ratón y creamos una clase nueva a la que llamaremos configuracion. Y en la cual vamos a ir añadiendo el siguiente código:

private final String SHARED_PREFS_FILE = "HMPrefs"; private final String KEY_EMAIL = "email"; private Context mContext;

public configuracion(Context context){ mContext = context; }

Lo primero que hacemos es declarar una variable privada de tipo Context para utilizar más tarde y el constructor de nuestra clase donde seteamos esta variable. También definimos un par de variables, una de ellas es nombre de nuestro archivo de configuración, el otro es el nombre de una de nuestras claves que guardaremos, en este caso un email. Continuamos:

private SharedPreferences getSettings(){ return mContext.getSharedPreferences(SHARED_PREFS_FILE, 0); } public String getUserEmail(){ return getSettings().getString(KEY_EMAIL, null); } public void setUserEmail(String email){     SharedPreferences.Editor editor = geSettings().edit();     editor.putString(KEY_EMAIL, email );     editor.commit(); }

Lo siguiente que hemos hecho ha sido crear un método privado en nuestra clase que nos devuelve un objeto tipo SharedPreferences el cual abrimos en modo PRIVATE con el segundo parámetro, lo que significa que solo será accesible por nuestra aplicación.

El siguiente método lo que hace es devolvernos un string buscando en las preferencias por la clave que definimos antes. El segundo parámetro de getString es el valor por defecto en caso de no encontrar la clave, en este caso es un null. Además podemos obtener o guardar otros tipos de datos, en vez de getString o putString utilizariamos getInt, putInt, etc...

El último método lo que hace es crear un editor para las preferencias y escribir el valor establecido para la clave KEY_MAIL.

Nuestra clase para guardar nuestras configuraciones ya está lista, ahora veremos un pequeño ejemplo de uso. Para ello vamos a crear tres controles, un TextView, un EditText y un Button, en el layout principal de nuestra aplicación(main.xml). Quedando así:

<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/lblEmail" /> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/txtEmail" android:inputType="textEmailAddress"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btnEmail" android:text="guardar" />

Aquí lo único destacable es el atributo inputType de nuestro EditText el cual adaptará nuestro teclado para poder escribir un email mucho mejor, pero no evita que tengamos que hacer una comprobación de lo que ha introducido el usuario. Ahora abrimos nuestra Activity HolaMundoActivity.java para añadir la siguiente funcionalidad:

//Definimos las variables para los 3 controles private Button btnEmail; private TextView lblEmail; private EditText txtEmail; //Definimos una variable para el objeto de tipo configuracion private configuracion conf;     @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.main);                 //Instanciamos los controles y el objeto configuración         btnEmail = (Button) findViewById(R.id.btnEmail);         lblEmail = (TextView) findViewById(R.id.lblEmail);         txtEmail = (EditText) findViewById(R.id.txtEmail);         conf = new configuracion(this);                 //Escribimos el valor del email guardado anteriormente, si existe dicho valor         if(conf.getUserEmail() != null)         lblEmail.setText(conf.getUserEmail());                       //Definimos el evento click del botón para poder guardar el nuevo email         btnEmail.setOnClickListener(new OnClickListener() { public void onClick(View v) { conf.setUserEmail(txtEmail.getText().toString()); } }); }

Os he ido comentando el código un poco, pero básicamente lo que hace esto es leer la configuración y escribirla en la etiqueta si existe, y mediante la caja de texto y el botón podemos escribir en nuestra configuración un nuevo valor. Es un ejemplo muy muy simple para que veáis como poder utilizar nuestra clase configuracion.


He omitido el resto del código del activity así como los import por agilidad y por que Eclipse os irá diciendo donde hacen falta los import.


Para probarlo lo que tenéis que hacer es iniciar la aplicación, la primera vez no es escribirá nada en la etiqueta. Introducís un email y lo guardáis con el botón. Cerráis la aplicación y al volver a entrar debería escribirse vuestro email en la etiqueta.

Bueno, esto es todo sobre las SharedPreferences. La semana que viene seguiremos guardando datos pero esta vez ya en bases de datos. Un saludo.

Comments are closed.