- José Enrique Amaro Soriano
- Android
- index_split_009.html
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.