Saltar la navegación

4.4.1. SharedPreferences

Si lo que necesitamos guardar no es más que un pequeño conjunto de pares clave-valor, deberíamos utilizar la clase SharedPreferences. Un objeto de este tipo utilizará un archivo para escribir y leer pares clave-valor. Pero nosotros solo veremos una simple interfaz con algunos pocos métodos con los que podremos hacer persistentes nuestros datos. Si necesitamos el objeto desde un objeto de nuestra app que no sea una activity, tendríamos que crearlo con:

val sharedPref = getSharedPreferences("configuracion", Context.MODE_PRIVATE)

Lo que hace esta función es crear, o abrir si ya existiese, un archivo de pares clave-valor con el nombre pasado como primer parámetro. El segundo parámetro es un flag que controla la creación del archivo.

MODE_PRIVATE hará que este archivo sea privado para otras apps. Este archivo sería accesible desde cualquier parte de la aplicación.

MODE_WORLD_READABLE y MODE_WORLD_WRITEABLE dan acceso en lectura y escritura respectivamente a todo el mundo.

Si, por el contrario, quisiéramos almacenar solo valores para una actividad en concreto, podríamos crear el objeto con:

val sharedPref = getPreferences(Context.MODE_PRIVATE)

Aquí se ahorra el nombre del archivo, porque el archivo estará asociado unívocamente con la activity que lo llame. De este modo, podríamos tener un archivo por actividad sin riesgo de confundirnos con los nombres.

Almacenar valores

val sharedPref = getPreferences(Context.MODE_PRIVATE)
with(sharedPref.edit()) {
putInt("claveInt", 69)
putString("claveString", "valor")
putBoolean("claveBoolean", true)
//...
//commit()//llamada síncrona, ten cuidado con el main thread
apply()//llamada asíncrona, puedes llamarla en el main thread
}

Vemos que lo primero es acceder a una instancia de SharedPreferences con uno de los dos métodos que hemos visto. Después, llamaríamos a edit para ponernos en modo escritura. Ahora podríamos llamar a los métodos putX necesarios para guardar todas nuestras variables.

Por cada tipo de datos, tendremos una llamada a la clase. Cuando hallamos terminado, llamaremos a apply, que dará por finalizada la edición, aunque el proceso de escritura definitivo lo ejecutará en un hilo distinto para no paralizar la interfaz gráfica de la activity. Si fuesen pocos campos, podríamos llamar a comit, pero salvo que sea imprescindible, preferiremos utilizar el método apply.

Recuperar datos

val sharedPref = getPreferences(Context.MODE_PRIVATE)
val valorInt = sp1.getInt("claveInt", 0)
val valorString = sp1.getString("claveString", null)
val valorBoolean = sp1.getBoolean("claveBoolean", false)

Si no son demasiados valores y son básicamente pares de clave-valor, este será el método que utilizaremos.