Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Cómo Android SharedPreferences guarda / almacena un objeto

Tenemos que 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í:

  • Última palabra mostrada en una vista de texto
  • ¿Por qué NotificationManagerCompat :: cancelAll () obtiene SecurityException?
  • Uso de iconos en las preferencias de Android
  • Campos personalizados para un tipo de compilación en gradle
  • La mejor manera de que el archivo HTML local se comunique con (local de lectura / escritura) local .xlsm Archivo de Excel
  • Error "Paquete R no existe" al crear con Gradle desde la línea de comandos
  • SharedPreferences.Editor prefsEditor = myPrefs.edit(); prefsEditor.putString("BusinessUnit", strBusinessUnit); 

  • ¿Cómo crear su propia biblioteca para el desarrollo de Android que se utilizará en cada programa que escriba?
  • TextView tinte en AppCompat
  • ¿Cómo agrego un proyecto de biblioteca a Android Studio?
  • Android Outofmemory dibujable
  • Set Drawable o Bitmap como icono En la notificación en Android
  • ¿Cómo detectar si el cajón de navegación está abierto?
  • 10 Solutions collect form web for “Cómo Android SharedPreferences guarda / almacena un objeto”

    Puede utilizar gson.jar para almacenar objetos de clase en SharedPreferences . Puede descargar este tarro de google-gson

    O agregue dependencia GSON en el archivo Gradle:

     compile 'com.google.code.gson:gson:2.7' 

    Creación de una preferencia compartida:

     SharedPreferences mPrefs = getPreferences(MODE_PRIVATE); 

    Ahorrar:

     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 añadir a la respuesta @ MuhammadAamirALi, puede usar Gson para guardar y recuperar una lista de objetos

    Guardar la 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 la 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 los campos de cualquier objeto a la preferencia compartida serializando el objeto a String. Aquí he utilizado GSON para almacenar cualquier objeto a la preferencia compartida.

    Guardar objeto a la 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 agregar la compile 'com.google.code.gson:gson:2.6.2' a las dependencies de 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); 

    Codificación feliz !

    Es mejor hacer una clase Constants global para guardar la clave o las variables para buscar o guardar datos.

    Para guardar datos, llame a este método para guardar datos desde cualquier lugar.

     public static void saveData(Context con, String variable, String data) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(con); prefs.edit().putString(variable, data).commit(); } 

    Utilícelo para obtener datos.

     public static String getData(Context con, String variable, String defaultValue) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(con); String data = prefs.getString(variable, defaultValue); return data; } 

    Y un método algo así hará el truco

     public static User getUserInfo(Context con) { String id = getData(con, Constants.USER_ID, null); String name = getData(con, Constants.USER_NAME, null); if(id != null && name != null) { User user = new User(); //Hope you will have a user Object. user.setId(id); user.setName(name); //Here set other credentials. return user; } else return null; } 

    No ha declarado lo que debe hacer con el objeto prefsEditor después de esto, pero para persistir los datos de preferencia, también debe utilizar:

     prefsEditor.commit(); 

    Pruebe esta mejor manera:

    PreferenceConnector.java

     import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; public class PreferenceConnector { public static final String PREF_NAME = "ENUMERATOR_PREFERENCES"; public static final String PREF_NAME_REMEMBER = "ENUMERATOR_REMEMBER"; public static final int MODE = Context.MODE_PRIVATE; public static final String name = "name"; public static void writeBoolean(Context context, String key, boolean value) { getEditor(context).putBoolean(key, value).commit(); } public static boolean readBoolean(Context context, String key, boolean defValue) { return getPreferences(context).getBoolean(key, defValue); } public static void writeInteger(Context context, String key, int value) { getEditor(context).putInt(key, value).commit(); } public static int readInteger(Context context, String key, int defValue) { return getPreferences(context).getInt(key, defValue); } public static void writeString(Context context, String key, String value) { getEditor(context).putString(key, value).commit(); } public static String readString(Context context, String key, String defValue) { return getPreferences(context).getString(key, defValue); } public static void writeLong(Context context, String key, long value) { getEditor(context).putLong(key, value).commit(); } public static long readLong(Context context, String key, long defValue) { return getPreferences(context).getLong(key, defValue); } public static SharedPreferences getPreferences(Context context) { return context.getSharedPreferences(PREF_NAME, MODE); } public static Editor getEditor(Context context) { return getPreferences(context).edit(); } } 

    Escriba el valor:

     PreferenceConnector.writeString(this, PreferenceConnector.name,"Girish"); 

    Y obtener valor con:

     String name= PreferenceConnector.readString(this, PreferenceConnector.name, ""); 

    Vea aquí, esto puede ayudarle:

     public static boolean setObject(Context context, Object o) { Field[] fields = o.getClass().getFields(); SharedPreferences sp = context.getSharedPreferences(o.getClass() .getName(), Context.MODE_PRIVATE); Editor editor = sp.edit(); for (int i = 0; i < fields.length; i++) { Class<?> type = fields[i].getType(); if (isSingle(type)) { try { final String name = fields[i].getName(); if (type == Character.TYPE || type.equals(String.class)) { Object value = fields[i].get(o); if (null != value) editor.putString(name, value.toString()); } else if (type.equals(int.class) || type.equals(Short.class)) editor.putInt(name, fields[i].getInt(o)); else if (type.equals(double.class)) editor.putFloat(name, (float) fields[i].getDouble(o)); else if (type.equals(float.class)) editor.putFloat(name, fields[i].getFloat(o)); else if (type.equals(long.class)) editor.putLong(name, fields[i].getLong(o)); else if (type.equals(Boolean.class)) editor.putBoolean(name, fields[i].getBoolean(o)); } catch (IllegalAccessException e) { LogUtils.e(TAG, e); } catch (IllegalArgumentException e) { LogUtils.e(TAG, e); } } else { // FIXME 是对象则不写入} } return editor.commit(); } 

    https://github.com/AltasT/PreferenceVObjectFile/blob/master/PreferenceVObjectFile/src/com/altas/lib/PreferenceUtils.java

    Si su objeto es complejo sugeriría a Serialize / XML / JSON él y excepto esos contenidos a la tarjeta del SD. Puede encontrar información adicional sobre cómo guardar en almacenamiento externo aquí: http://developer.android.com/guide/topics/data/data-storage.html#filesExternal

    Otra forma de guardar y restaurar un objeto desde android sharedpreferences sin usar el formato Json

     private static ExampleObject getObject(Context c,String db_name){ SharedPreferences sharedPreferences = c.getSharedPreferences(db_name, Context.MODE_PRIVATE); ExampleObject o = new ExampleObject(); Field[] fields = o.getClass().getFields(); try { for (Field field : fields) { Class<?> type = field.getType(); try { final String name = field.getName(); if (type == Character.TYPE || type.equals(String.class)) { field.set(o,sharedPreferences.getString(name, "")); } else if (type.equals(int.class) || type.equals(Short.class)) field.setInt(o,sharedPreferences.getInt(name, 0)); else if (type.equals(double.class)) field.setDouble(o,sharedPreferences.getFloat(name, 0)); else if (type.equals(float.class)) field.setFloat(o,sharedPreferences.getFloat(name, 0)); else if (type.equals(long.class)) field.setLong(o,sharedPreferences.getLong(name, 0)); else if (type.equals(Boolean.class)) field.setBoolean(o,sharedPreferences.getBoolean(name, false)); else if (type.equals(UUID.class)) field.set( o, UUID.fromString( sharedPreferences.getString( name, UUID.nameUUIDFromBytes("".getBytes()).toString() ) ) ); } catch (IllegalAccessException e) { Log.e(StaticConfig.app_name, "IllegalAccessException", e); } catch (IllegalArgumentException e) { Log.e(StaticConfig.app_name, "IllegalArgumentException", e); } } } catch (Exception e) { System.out.println("Exception: " + e); } return o; } private static void setObject(Context context, Object o, String db_name) { Field[] fields = o.getClass().getFields(); SharedPreferences sp = context.getSharedPreferences(db_name, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); for (Field field : fields) { Class<?> type = field.getType(); try { final String name = field.getName(); if (type == Character.TYPE || type.equals(String.class)) { Object value = field.get(o); if (value != null) editor.putString(name, value.toString()); } else if (type.equals(int.class) || type.equals(Short.class)) editor.putInt(name, field.getInt(o)); else if (type.equals(double.class)) editor.putFloat(name, (float) field.getDouble(o)); else if (type.equals(float.class)) editor.putFloat(name, field.getFloat(o)); else if (type.equals(long.class)) editor.putLong(name, field.getLong(o)); else if (type.equals(Boolean.class)) editor.putBoolean(name, field.getBoolean(o)); else if (type.equals(UUID.class)) editor.putString(name, field.get(o).toString()); } catch (IllegalAccessException e) { Log.e(StaticConfig.app_name, "IllegalAccessException", e); } catch (IllegalArgumentException e) { Log.e(StaticConfig.app_name, "IllegalArgumentException", e); } } editor.apply(); } 

    Si desea almacenar todo el objeto que obtiene en respuesta, puede lograr haciendo algo como,

    Primero Cree un método que convierta su JSON en una cadena en su clase util como se muestra a continuación.

      public static <T> T fromJson(String jsonString, Class<T> theClass) { return new Gson().fromJson(jsonString, theClass); } 

    Entonces en clases de preferencias compartidas Haga algo como,

    `Public void storeLoginResponse (yourResponseClass objName) {

      String loginJSON = UtilClass.toJson(customer); if (!TextUtils.isEmpty(customerJSON)) { editor.putString(AppConst.PREF_CUSTOMER, customerJSON); editor.commit(); } }` 

    Y luego crear un método para getPreferences

     public Customer getCustomerDetails() { String customerDetail = pref.getString(AppConst.PREF_CUSTOMER, null); if (!TextUtils.isEmpty(customerDetail)) { return GSONConverter.fromJson(customerDetail, Customer.class); } else { return new Customer(); } } 

    Entonces simplemente llame al primer método cuando obtenga la respuesta y en segundo lugar cuando necesite obtener datos de las preferencias de compartir como

     String token = SharedPrefHelper.get().getCustomerDetails().getAccessToken(); 

    eso es todo.

    Espero que te ayude..!!

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.