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.
- Cómo hacer que la aplicación vaya a otra página si no se ejecuta por primera vez
- ¿Qué técnica de almacenamiento de datos Android utilizar?
- Cómo guardar un paquete completo en SharedPreferences
- ¿Cómo uso las preferencias de los fragmentos con ViewPager?
- ListView y SharedPreferences de opción múltiple
- ¿Cuándo se aplicarán SharedPreferences () y commit ()?
- Eliminar todas las preferencias compartidas de mi aplicación
- Alcance de SharedPreferences
- registerOnSharedPreferenceChangeListener no funciona para los cambios realizados en diferentes procesos
- Android - ¿Cómo obtengo las preferencias compartidas de otra actividad?
- ¿Es posible almacenar el objeto estático de la clase en la preferencia compartida?
- Leer la preferencia compartida cuando se cambia el contexto
- ¿Cómo puedo compartir un archivo SharedPreferences a través de dos aplicaciones de Android diferentes?
-
Descargar
gson-1.7.1.jar
desde este enlace: GsonLibJar -
Agregue esta biblioteca a su proyecto android y configure la ruta de construcción.
-
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"); } } } }
-
Cree una clase más extendiendo la clase
Application
como éstapackage 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; } }
-
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>
-
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"); } } }
-
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);
- ¿Se requiere setContentIntent (PendingIntent) en NotificationCompat.Builder?
- El alias Keytool no existe