¿Cómo se guardan/almacenan objetos en SharedPreferences en Android?

Resuelto Piraba asked hace 54 años • 24 respuestas

Necesito obtener objetos de usuario en muchos lugares, que contienen muchos campos. Después de iniciar sesión, quiero guardar/almacenar estos objetos de usuario. ¿Cómo podemos implementar este tipo de escenario?

No puedo almacenarlo así:

SharedPreferences.Editor prefsEditor = myPrefs.edit();
prefsEditor.putString("BusinessUnit", strBusinessUnit);
Piraba avatar Jan 01 '70 08:01 Piraba
Aceptado

Puedes usar gson.jar para almacenar objetos de clase en SharedPreferences . Puedes descargar este jar desde google-gson

O agregue la dependencia GSON en su archivo Gradle:

implementation 'com.google.code.gson:gson:2.8.8'

puedes encontrar la última versión aquí

Crear una preferencia compartida:

SharedPreferences  mPrefs = getPreferences(MODE_PRIVATE);

Ahorrar:

MyObject myObject = new MyObject;
//set variables of 'myObject', etc.

Editor prefsEditor = mPrefs.edit();
Gson gson = new Gson();
String json = gson.toJson(myObject);
prefsEditor.putString("MyObject", json);
prefsEditor.commit();

Para recuperar:

Gson gson = new Gson();
String json = mPrefs.getString("MyObject", "");
MyObject obj = gson.fromJson(json, MyObject.class);
Muhammad Aamir Ali avatar Aug 27 '2013 11:08 Muhammad Aamir Ali

Para agregar a la respuesta de @MuhammadAamirALi, puede usar Gson para guardar y recuperar una lista de objetos.

Guardar lista de objetos definidos por el usuario en SharedPreferences

public static final String KEY_CONNECTIONS = "KEY_CONNECTIONS";
SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit();

User entity = new User();
// ... set entity fields

List<Connection> connections = entity.getConnections();
// convert java object to JSON format,
// and returned as JSON formatted string
String connectionsJSONString = new Gson().toJson(connections);
editor.putString(KEY_CONNECTIONS, connectionsJSONString);
editor.commit();

Obtener lista de objetos definidos por el usuario de SharedPreferences

String connectionsJSONString = getPreferences(MODE_PRIVATE).getString(KEY_CONNECTIONS, null);
Type type = new TypeToken < List < Connection >> () {}.getType();
List < Connection > connections = new Gson().fromJson(connectionsJSONString, type);
Etienne Lawlor avatar Sep 19 '2013 20:09 Etienne Lawlor

Sé que este hilo es un poco viejo. Pero voy a publicar esto de todos modos con la esperanza de que pueda ayudar a alguien. Podemos almacenar campos de cualquier Objeto según preferencia compartida serializando el objeto en Cadena. Aquí lo he usado GSONpara almacenar cualquier objeto según preferencia compartida.

Guardar objeto en preferencia:

public static void saveObjectToSharedPreference(Context context, String preferenceFileName, String serializedObjectKey, Object object) {
    SharedPreferences sharedPreferences = context.getSharedPreferences(preferenceFileName, 0);
    SharedPreferences.Editor sharedPreferencesEditor = sharedPreferences.edit();
    final Gson gson = new Gson();
    String serializedObject = gson.toJson(object);
    sharedPreferencesEditor.putString(serializedObjectKey, serializedObject);
    sharedPreferencesEditor.apply();
}

Recuperar objeto de preferencia:

public static <GenericClass> GenericClass getSavedObjectFromPreference(Context context, String preferenceFileName, String preferenceKey, Class<GenericClass> classType) {
    SharedPreferences sharedPreferences = context.getSharedPreferences(preferenceFileName, 0);
    if (sharedPreferences.contains(preferenceKey)) {
        final Gson gson = new Gson();
        return gson.fromJson(sharedPreferences.getString(preferenceKey, ""), classType);
    }
    return null;
}

Nota :

Recuerde agregarlo compile 'com.google.code.gson:gson:2.6.2'en dependenciessu gradle.

Ejemplo :

//assume SampleClass exists
SampleClass mObject = new SampleObject();

//to store an object
saveObjectToSharedPreference(context, "mPreference", "mObjectKey", mObject);

//to retrive object stored in preference
mObject = getSavedObjectFromPreference(context, "mPreference", "mObjectKey", SampleClass.class);

Actualizar:

Como @Sharp_Edge señaló en los comentarios, la solución anterior no funciona con List.

Una ligera modificación en la firma de getSavedObjectFromPreference()- de Class<GenericClass> classTypea Type classTypegeneralizará esta solución. Firma de función modificada,

public static <GenericClass> GenericClass getSavedObjectFromPreference(Context context, String preferenceFileName, String preferenceKey, Type classType)

Para invocar,

getSavedObjectFromPreference(context, "mPreference", "mObjectKey", (Type) SampleClass.class)

¡Feliz codificación!

mrtpk avatar Sep 11 '2016 11:09 mrtpk