Android
5.GUARDAR DATOS CON SharedPreferences
Página 6 de 25
5. GUARDAR DATOS CON SharedPreferences
SharedPreferences es una clase para leer y modificar datos. El código para abrir un fichero de datos asociado a la variable misDatos sería:
SharedPreferences misDatos =
getSharedPreferences(fichero,acceso);
donde fichero es el nombre del fichero donde queremos guardar las preferencias, sin extensión. Si el fichero no existe, se crea uno nuevo. El número entero acceso es usualmente 0, indicando fichero privado. Para leer las preferencias se usa el método getString() o también getFloat(), getInt() para leer números.
Para modificar las preferencias se utiliza un Editor, un objeto de la clase SharedPreferences.Editor, que permite escribir datos con sus etiquetas (entre comillas) y salvar el fichero de la siguiente forma:
SharedPreferences.Editor miEditor=misDatos.edit();
// escribe los datos
miEditor.putString("nombre",nombre);
miEditor.putFloat("x",x);
miEditor.putFloat("y",y);
// salvar
miEditor.commit();
Para leer las preferencias se utilizaría el siguiente código:
// Lee en el fichero de preferencias
nombre=misDatos.getString("nombre","Valor por defecto");
x=misDatos.getFloat("x", 0);
y=misDatos.getFloat("y", 0);
donde el segundo parámetro de los métodos getString() y getFloat() es el valor que se devuelve por defecto si el dato no existe.
La siguiente actividad define tres campos para introducir un nombre y dos coordenadas que se guardan en un fichero de preferencias. El fichero se lee al ejecutar la actividad y muestra los valores en los campos de texto. Los datos se guardan en el método onPause(), que se ejecuta cuando la actividad pasa a segundo plano o finaliza. Usamos un Toast para indicar que las preferencias se han guardado.
public class Preferencias extends Activity {
SharedPreferences misDatos;
EditText editNombre,editX,editY;
String nombre;
Float x,y;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
editNombre=(EditText) findViewById(R.id.nombre);
editX=(EditText) findViewById(R.id.coordenadaX);
editY=(EditText) findViewById(R.id.coordenadaY);
//Abre un fichero de preferencias.
// El parámetro 0 indica privado
misDatos= getSharedPreferences("preferencias",0);
// Lee en el fichero de preferencias
nombre=misDatos.getString("nombre",
"Valor por defecto");
x=misDatos.getFloat("x", 0);
y=misDatos.getFloat("y", 0);
// escribe las preferencias en los campos de texto
editNombre.setText(nombre);
editX.setText(""+x);
editY.setText(""+y);
}
@Override
protected void onPause(){
super.onPause();
// extrae el contenido de los campos de texto
nombre=editNombre.getText().toString();
x=Float.parseFloat(editX.getText().toString());
y=Float.parseFloat(editY.getText().toString());
// define un editor para misDatos
SharedPreferences.Editor miEditor=misDatos.edit();
// escribe los datos
miEditor.putString("nombre",nombre);
miEditor.putFloat("x",x);
miEditor.putFloat("y",y);
// salvar
miEditor.commit();
Toast.makeText(this,"Preferencias guardadas",1).show();
}
}
Figura 5.1. Guardar datos con SharedPreferences.
El fichero main.xml correspondiente a esta aplicación es el siguiente:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:background="#ffffdd"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/layout1"
>
<TextView
android:textSize="24sp"
android:textColor="#000000"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Introduzca sus preferencias"
android:id="@+id/text1"
/>
<TextView
android:textSize="24sp"
android:textColor="#000000"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Nombre"
/>
<EditText android:id="@+id/nombre"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="EditText">
</EditText>
<TextView
android:textSize="24sp"
android:textColor="#000000"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Coordenada X:"
/>
<EditText android:id="@+id/coordenadaX"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="EditText">
</EditText>
<TextView
android:textSize="24sp"
android:textColor="#000000"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Coordenada Y:"
/>
<EditText android:id="@+id/coordenadaY"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="EditText">
</EditText>
</LinearLayout>
El resultado se muestra en la figura 5.1. Los datos se guardan cuando se sale de la aplicación, pulsando la tecla home o la tecla de llamada telefónica, por ejemplo. Cuando se vuelve a ejecutar la aplicación los datos guardados se leen y muestran en la pantalla. El fichero con los datos se escribe físicamente en el directorio local de datos de la aplicacion. En el caso del dispositivo virtual, desde ECLIPSE este fichero se puede ver abriendo la perspectiva DDMS. La ruta del fichero de preferencias en mi caso es:
/data/data/es.ugr.amaro.preferencias/shared_prefs/
y el fichero con los datos se llama preferencias.xml.
Este fichero tiene extenxión xml y se puede copiar pulsando la opción "pull a file from the device’’. Su contenido es el siguiente:
<?xml version=‘1.0’ encoding=‘utf-8’ standalone=‘yes’ ?>
<map>
<string name="nombre">amaro</string>
<float name="y" value="200.1" />
<float name="x" value="100.1" />
</map>
Aquí vemos que los valores float, en realidad, se almacenan también como cadenas, lo que manifiesta la relativa utilidad de putFloat(). Es preferible almacenar con putString()y luego convertir las cadenas en números.