almacenar y recuperar un objeto de clase en preferencia compartida
¿En Android podemos almacenar un objeto de una clase en preferencia compartida y recuperar el objeto más tarde?
Si es posible ¿cómo hacerlo? Si no es posible ¿cuáles son las otras posibilidades de hacerlo?
Sé que la serialización es una opción, pero estoy buscando posibilidades utilizando preferencias compartidas.
Sí, podemos hacer esto usando Gson.
Descargar código de trabajo desde GitHub
SharedPreferences mPrefs = getPreferences(MODE_PRIVATE);
para salvar
Editor prefsEditor = mPrefs.edit();
Gson gson = new Gson();
String json = gson.toJson(myObject); // myObject - instance of MyObject
prefsEditor.putString("MyObject", json);
prefsEditor.commit();
Olvidar
Gson gson = new Gson();
String json = mPrefs.getString("MyObject", "");
MyObject obj = gson.fromJson(json, MyObject.class);
Actualización1
La última versión de GSON se puede descargar desde github.com/google/gson .
Actualización2
Si está utilizando Gradle/Android Studio, simplemente coloque lo siguiente en build.gradle
la sección de dependencias:
implementation 'com.google.code.gson:gson:2.6.2'
Podemos usar Outputstream para enviar nuestro Objeto a la memoria interna. Y conviértalo en cadena y luego guárdelo con preferencia. Por ejemplo:
mPrefs = getPreferences(MODE_PRIVATE);
SharedPreferences.Editor ed = mPrefs.edit();
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutput;
try {
objectOutput = new ObjectOutputStream(arrayOutputStream);
objectOutput.writeObject(object);
byte[] data = arrayOutputStream.toByteArray();
objectOutput.close();
arrayOutputStream.close();
ByteArrayOutputStream out = new ByteArrayOutputStream();
Base64OutputStream b64 = new Base64OutputStream(out, Base64.DEFAULT);
b64.write(data);
b64.close();
out.close();
ed.putString(key, new String(out.toByteArray()));
ed.commit();
} catch (IOException e) {
e.printStackTrace();
}
cuando necesitamos extraer el Objeto de la Preferencia. Utilice el código como se muestra a continuación
byte[] bytes = mPrefs.getString(indexName, "{}").getBytes();
if (bytes.length == 0) {
return null;
}
ByteArrayInputStream byteArray = new ByteArrayInputStream(bytes);
Base64InputStream base64InputStream = new Base64InputStream(byteArray, Base64.DEFAULT);
ObjectInputStream in;
in = new ObjectInputStream(base64InputStream);
MyObject myObject = (MyObject) in.readObject();
Tuve el mismo problema, aquí está mi solución:
Tengo una clase MyClass
y ArrayList<MyClass>
quiero guardarla en Preferencias compartidas. Al principio agregué un método que MyClass
lo convierte en un objeto JSON:
public JSONObject getJSONObject() {
JSONObject obj = new JSONObject();
try {
obj.put("id", this.id);
obj.put("name", this.name);
} catch (JSONException e) {
e.printStackTrace();
}
return obj;
}
Entonces aquí está el método para guardar el objeto ArrayList<MyClass> items
:
SharedPreferences mPrefs = context.getSharedPreferences("some_name", 0);
SharedPreferences.Editor editor = mPrefs.edit();
Set<String> set= new HashSet<String>();
for (int i = 0; i < items.size(); i++) {
set.add(items.get(i).getJSONObject().toString());
}
editor.putStringSet("some_name", set);
editor.commit();
Y aquí está el método para recuperar el objeto:
public static ArrayList<MyClass> loadFromStorage() {
SharedPreferences mPrefs = context.getSharedPreferences("some_name", 0);
ArrayList<MyClass> items = new ArrayList<MyClass>();
Set<String> set = mPrefs.getStringSet("some_name", null);
if (set != null) {
for (String s : set) {
try {
JSONObject jsonObject = new JSONObject(s);
Long id = jsonObject.getLong("id"));
String name = jsonObject.getString("name");
MyClass myclass = new MyClass(id, name);
items.add(myclass);
} catch (JSONException e) {
e.printStackTrace();
}
}
return items;
}
Tenga en cuenta que StringSet
en Preferencias compartidas está disponible desde API 11.
Usando la biblioteca Gson:
dependencies {
compile 'com.google.code.gson:gson:2.8.2'
}
Almacenar:
Gson gson = new Gson();
//Your json response object value store in json object
JSONObject jsonObject = response.getJSONObject();
//Convert json object to string
String json = gson.toJson(jsonObject);
//Store in the sharedpreference
getPrefs().setUserJson(json);
Recuperar:
String json = getPrefs().getUserJson();