Cómo guardar datos simples con SharedPreferences

Si tienes una colección relativamente pequeña de pares clave-valor que deseas guardar, debes usar las APIs de SharedPreferences. Un objeto SharedPreferences apunta a un archivo que contiene pares clave-valor y proporciona métodos sencillos para leerlos y escribirlos. El framework administra cada archivo de SharedPreferences, que puede ser privado o compartido.

En esta página, se muestra el uso de las APIs de SharedPreferences para almacenar y recuperar valores simples.

Cómo controlar las preferencias compartidas

Puedes crear un nuevo archivo de preferencias compartidas o acceder a uno existente llamando a uno de estos métodos:

  • getSharedPreferences(): Usa este método si necesitas varios archivos de preferencias compartidas identificados por nombre, que especificas con el primer parámetro. Puedes llamar a este método desde cualquier instancia de Context en tu app.
  • getPreferences(): Usa este método desde una instancia de Activity si necesitas utilizar un solo archivo de preferencias compartidas para la actividad. Como este método recupera un archivo de preferencias compartidas predeterminado que pertenece a la actividad, no necesitas indicar un nombre.

Por ejemplo, el siguiente código accede al archivo de preferencias compartidas identificado por la string de recursos R.string.preference_file_key y lo abre con el modo privado para que solo tu app pueda acceder al archivo:

Kotlin

val sharedPref = activity?.getSharedPreferences(
        getString(R.string.preference_file_key), Context.MODE_PRIVATE)

Java

Context context = getActivity();
SharedPreferences sharedPref = context.getSharedPreferences(
        getString(R.string.preference_file_key), Context.MODE_PRIVATE);

Cuando asignes un nombre a tus archivos de preferencias compartidas, este debe ser identificable de manera inequívoca con tu app. Una manera fácil de hacerlo es agregar el nombre del archivo al ID de aplicación. Por ejemplo: "com.example.myapp.PREFERENCE_FILE_KEY".

De forma alternativa, si necesitas solo un archivo de preferencias compartidas para tu actividad, puedes utilizar el método getPreferences():

Kotlin

val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE)

Java

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);

Si usas la API de SharedPreferences para guardar la configuración de la app, debes usar getDefaultSharedPreferences() en su lugar, para obtener el archivo de preferencias compartidas predeterminado para toda la app. Para obtener más información, consulta la Guía para desarrolladores de configuración.

Cómo escribir en las preferencias compartidas

Para realizar operaciones de escritura en el archivo de preferencias compartidas, crea un SharedPreferences.Editor llamando a edit() en tu SharedPreferences.

Pasa las claves y los valores que desees escribir con métodos como putInt() y putString(). Luego, llama a apply() o a commit() para guardar los cambios. Por ejemplo:

Kotlin

val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return
with (sharedPref.edit()) {
    putInt(getString(R.string.saved_high_score_key), newHighScore)
    apply()
}

Java

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(getString(R.string.saved_high_score_key), newHighScore);
editor.apply();

apply() cambia el objeto SharedPreferences en la memoria de inmediato, pero escribe las actualizaciones en el disco de forma asíncrona. Como alternativa, puedes usar commit() para escribir los datos en el disco de forma síncrona. Sin embargo, debido a que commit() es síncrono, debes evitar llamarlo desde tu subproceso principal, ya que podría pausar el procesamiento de la IU.

Cómo leer desde las preferencias compartidas

Para recuperar valores de un archivo de preferencias compartidas, llama a métodos como getInt() y getString(), proporciona la clave del valor que desees y, opcionalmente, un valor predeterminado para mostrar si no se encuentra la clave. Por ejemplo:

Kotlin

val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return
val defaultValue = resources.getInteger(R.integer.saved_high_score_default_key)
val highScore = sharedPref.getInt(getString(R.string.saved_high_score_key), defaultValue)

Java

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
int defaultValue = getResources().getInteger(R.integer.saved_high_score_default_key);
int highScore = sharedPref.getInt(getString(R.string.saved_high_score_key), defaultValue);