¿Cómo se guardan/almacenan objetos en SharedPreferences en Android?
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);
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);
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);
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 GSON
para 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 dependencies
su 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> classType
a Type classType
generalizará 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!