113 votes

de stocker et de récupérer un objet de classe partagée de préférence

Dans android, j'ai besoin de savoir si l'on peut stocker un objet d'une classe partagée de la préférence et de récupérer le dernier objet.Si c'est possible comment le faire.Si il n'est pas possible, quelles sont les autres possibilités de le faire.Je sais que la sérialisation est une option, mais je suis à la recherche de possibilités de l'utilisation partagée de préférence.

Toute aide est appréciée.

Merci.

332voto

Parag Chauhan Points 11830

Oui nous pouvons le faire à l'aide de gson.jar

Télécharger code de Travail à partir de Github

     SharedPreferences  mPrefs = getPreferences(MODE_PRIVATE);

Pour enregistrer

     Editor prefsEditor = mPrefs.edit();
     Gson gson = new Gson();
     String json = gson.toJson("MyObject");
     prefsEditor.putString("MyObject", json);
     prefsEditor.commit();

Pour obtenir

    Gson gson = new Gson();
    String json = mPrefs.getString("MyObject", "");
    MyObject obj = gson.fromJson(json, MyObject.class);

44voto

Kislingk Points 450

nous pouvons utiliser Outputstream à la sortie de notre Objet de mémoire interne. Et le convertir en chaîne de caractères puis de les enregistrer, de préférence. Par exemple:

    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();
    }

lorsque nous avons besoin d'extraire de l'Objet de la Préférence. Utiliser le code comme ci-dessous

    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();

16voto

Blundell Points 28342

Pas possible.

Vous ne pouvez stocker, de simples valeurs dans SharedPrefences SharePreferences.L'éditeur

Ce qui en particulier sur la classe, devez-vous épargner?

8voto

Micer Points 936

J'ai eu le même problème, voici ma solution:

J'ai de la classe MyClass et ArrayList< Maclasse > que je veux mettre en partage des Préférences. Au début, j'ai ajouté une méthode pour MyClass qui la convertit en objet 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;
}

Alors voici la méthode pour économiser de l'objet "ArrayList< Maclasse >":

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();

Et voici la méthode de récupération de l'objet:

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);
    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;
}

Notez que StringSet en commun des Préférences est disponible depuis API 11.

-3voto

luc.chante Points 145

Avez-vous besoin de récupérer l'objet, même après l'application de l'arrêt de donw ou pendant qu'il est en cours d'exécution ?

Vous pouvez les stocker dans une base de données.
Ou tout Simplement créer une Application personnalisée de classe.

public class MyApplication extends Application {

    private static Object mMyObject;
    // static getter & setter
    ...
}

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application ... android:name=".MyApplication">
        <activity ... />
        ...
    </application>
    ...
</manifest>

Et puis de toutes les activités à faire :

((MyApplication) getApplication).getMyObject();

Pas vraiment le meilleur moyen, mais il fonctionne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X