Cómo almacenar objeto de clase en android sharedPreference?

Me gustaría almacenar objetos de clase en android sharedpreference. Hice una cierta búsqueda básica en ése y conseguí algunas respuestas como lo hago objeto serializable y lo almaceno pero mi necesidad es tan simple. Quisiera almacenar alguna información de usuario como nombre, dirección, edad y valor booleano activo. Hice una clase de usuario para eso.

public class User { private String name; private String address; private int age; private boolean isActive; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public boolean isActive() { return isActive; } public void setActive(boolean isActive) { this.isActive = isActive; } } 

Gracias.

  1. Descargar gson-1.7.1.jar desde este enlace: GsonLibJar

  2. Agregue esta biblioteca a su proyecto android y configure la ruta de construcción.

  3. Agregue la clase siguiente a su paquete.

     package com.abhan.objectinpreference; import java.lang.reflect.Type; import android.content.Context; import android.content.SharedPreferences; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; public class ComplexPreferences { private static ComplexPreferences complexPreferences; private final Context context; private final SharedPreferences preferences; private final SharedPreferences.Editor editor; private static Gson GSON = new Gson(); Type typeOfObject = new TypeToken<Object>(){} .getType(); private ComplexPreferences(Context context, String namePreferences, int mode) { this.context = context; if (namePreferences == null || namePreferences.equals("")) { namePreferences = "abhan"; } preferences = context.getSharedPreferences(namePreferences, mode); editor = preferences.edit(); } public static ComplexPreferences getComplexPreferences(Context context, String namePreferences, int mode) { if (complexPreferences == null) { complexPreferences = new ComplexPreferences(context, namePreferences, mode); } return complexPreferences; } public void putObject(String key, Object object) { if (object == null) { throw new IllegalArgumentException("Object is null"); } if (key.equals("") || key == null) { throw new IllegalArgumentException("Key is empty or null"); } editor.putString(key, GSON.toJson(object)); } public void commit() { editor.commit(); } public <T> T getObject(String key, Class<T> a) { String gson = preferences.getString(key, null); if (gson == null) { return null; } else { try { return GSON.fromJson(gson, a); } catch (Exception e) { throw new IllegalArgumentException("Object stored with key " + key + " is instance of other class"); } } } } 
  4. Cree una clase más extendiendo la clase Application como ésta

     package com.abhan.objectinpreference; import android.app.Application; public class ObjectPreference extends Application { private static final String TAG = "ObjectPreference"; private ComplexPreferences complexPrefenreces = null; @Override public void onCreate() { super.onCreate(); complexPrefenreces = ComplexPreferences.getComplexPreferences(getBaseContext(), "abhan", MODE_PRIVATE); android.util.Log.i(TAG, "Preference Created."); } public ComplexPreferences getComplexPreference() { if(complexPrefenreces != null) { return complexPrefenreces; } return null; } } 
  5. Agregue esa clase de aplicación en la etiqueta de application de manifiesto de esta manera.

     <application android:name=".ObjectPreference" android:allowBackup="false" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > ....your activities and the rest goes here </application> 
  6. En su actividad principal, donde desea almacenar el valor en la Shared Preference haga algo como esto.

     package com.abhan.objectinpreference; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; public class MainActivity extends Activity { private final String TAG = "MainActivity"; private ObjectPreference objectPreference; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); objectPreference = (ObjectPreference) this.getApplication(); User user = new User(); user.setName("abhan"); user.setAddress("Mumbai"); user.setAge(25); user.setActive(true); User user1 = new User(); user1.setName("Harry"); user.setAddress("London"); user1.setAge(21); user1.setActive(false); ComplexPreferences complexPrefenreces = objectPreference.getComplexPreference(); if(complexPrefenreces != null) { complexPrefenreces.putObject("user", user); complexPrefenreces.putObject("user1", user1); complexPrefenreces.commit(); } else { android.util.Log.e(TAG, "Preference is null"); } } } 
  7. En otra actividad en la que querías obtener el valor de Preference haz algo como esto.

     package com.abhan.objectinpreference; import android.app.Activity; import android.os.Bundle; public class SecondActivity extends Activity { private final String TAG = "SecondActivity"; private ObjectPreference objectPreference; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); objectPreference = (ObjectPreference) this.getApplication(); ComplexPreferences complexPreferences = objectPreference.getComplexPreference(); android.util.Log.i(TAG, "User"); User user = complexPreferences.getObject("user", User.class); android.util.Log.i(TAG, "Name " + user.getName()); android.util.Log.i(TAG, "Address " + user.getAddress()); android.util.Log.i(TAG, "Age " + user.getAge()); android.util.Log.i(TAG, "isActive " + user.isActive()); android.util.Log.i(TAG, "User1"); User user1 = complexPreferences.getObject("user", User.class); android.util.Log.i(TAG, "Name " + user1.getName()); android.util.Log.i(TAG, "Address " + user1.getAddress()); android.util.Log.i(TAG, "Age " + user1.getAge()); android.util.Log.i(TAG, "isActive " + user1.isActive()); } } 

Espero que esto le pueda ayudar. En esta respuesta utilicé tu clase para la referencia 'Usuario' para que puedas entender mejor. Sin embargo, no podemos retransmitir en este método si optamos por almacenar objetos muy grandes de preferencia ya que todos sabemos que tenemos un tamaño de memoria limitado para cada aplicación en el directorio de datos de modo que si está seguro de que sólo tiene datos limitados para almacenar en la preferencia compartida Puede utilizar esta alternativa.

Cualquier sugerencia sobre este implemento es bienvenida.

La otra manera es guardar cada propiedad por sí mismo .. Las preferencias aceptan sólo los tipos primitivos, por lo que no se puede poner un objeto complejo en ella

Podrías agregar algunas "SharedPreferences" normales, "address", "age" y "isActive" y simplemente cargarlas al instanciar la clase

Puede utilizar la clase global

  public class GlobalState extends Application { private String testMe; public String getTestMe() { return testMe; } public void setTestMe(String testMe) { this.testMe = testMe; } } 

Y luego Localice su etiqueta de aplicación en nadroid menifest, y añada esto:

  android:name="com.package.classname" 

Y puede establecer y obtener los datos de cualquiera de su actividad mediante el uso del siguiente código.

  GlobalState gs = (GlobalState) getApplication(); gs.setTestMe("Some String");</code> // Get values GlobalState gs = (GlobalState) getApplication(); String s = gs.getTestMe(); 

Solución simple de cómo almacenar el valor de inicio de sesión en SharedPreferences.

Puede extender la clase MainActivity u otra clase donde almacenará el "valor de algo que desea conservar". Ponga esto en las clases del escritor y del lector:

 public static final String GAME_PREFERENCES_LOGIN = "Login"; 

Aquí InputClass es entrada y OutputClass es clase de salida, respectivamente.

 // This is a storage, put this in a class which you can extend or in both classes: //(input and output) public static final String GAME_PREFERENCES_LOGIN = "Login"; // String from the text input (can be from anywhere) String login = inputLogin.getText().toString(); // then to add a value in InputCalss "SAVE", SharedPreferences example = getSharedPreferences(GAME_PREFERENCES_LOGIN, 0); Editor editor = example.edit(); editor.putString("value", login); editor.commit(); 

Ahora puedes usarlo en otro lugar, como en otras clases. Lo siguiente es OutputClass.

 SharedPreferences example = getSharedPreferences(GAME_PREFERENCES_LOGIN, 0); String userString = example.getString("value", "defValue"); // the following will print it out in console Logger.getLogger("Name of a OutputClass".class.getName()).log(Level.INFO, userString); 
  • OnSavedInstanceState vs. SharedPreferences
  • Primera vez que se muestra Solución de actividad
  • Cómo mostrar sólo una vez Iniciar sesión y luego después de iniciar la aplicación directamente en android
  • Android M extraño problema de preferencias compartidas
  • PreferenciaNo se encuentra la clase Screen
  • Android - sharedferences devuelve valor nulo
  • Cómo utilizar SharedPreferences
  • Guardar matrices de cadenas con SharedPreference
  • Android Studio - Explorador de archivos de Android Device Monitor no funciona
  • No se puede poner doble SharedPreferences
  • No se puede cambiar el texto mediante SharedPreferences
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.