almacenar y recuperar un objeto de clase en preferencia compartida

Resuelto androidGuy asked hace 54 años • 13 respuestas

¿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.

androidGuy avatar Jan 01 '70 08:01 androidGuy
Aceptado

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.gradlela sección de dependencias:

implementation 'com.google.code.gson:gson:2.6.2'
Parag Chauhan avatar Mar 23 '2013 15:03 Parag Chauhan

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();
Kislingk avatar May 01 '2012 21:05 Kislingk

Tuve el mismo problema, aquí está mi solución:

Tengo una clase MyClassy ArrayList<MyClass>quiero guardarla en Preferencias compartidas. Al principio agregué un método que MyClasslo 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 StringSeten Preferencias compartidas está disponible desde API 11.

Micer avatar Aug 22 '2013 14:08 Micer

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();
Ramesh sambu avatar Jan 06 '2016 04:01 Ramesh sambu