337 votes

Enregistrer ArrayList dans SharedPreferences

J'ai un ArrayList avec des objets personnalisés. Chaque objet contient une variété de chaînes de caractères et des nombres. J'ai besoin de la matrice de rester dans les parages, même si l'utilisateur quitte l'activité et veut revenir à un moment plus tard, cependant je n'ai pas besoin de la matrice après l'application a été complètement fermé. J'ai d'économiser beaucoup d'autres objets à l'aide de la SharedPreferences mais je ne peux pas trouver comment sauver mon tableau d'ensemble de cette façon. Est-ce possible? Peut-être SharedPreferences n'est pas la façon d'aller à ce sujet? Est-il une méthode plus simple?

450voto

evilone Points 10400

Après API 11 les SharedPreferences Éditeur acceptent des Ensembles. Vous pouvez convertir votre Liste dans un HashSet ou quelque chose de similaire et de le stocker comme ça. Lorsque votre le lire, de le convertir en une liste de tableaux, à les trier si besoin, et vous êtes bon pour aller.

//Retrieve the values
Set<String> set = myScores.getStringSet("key", null);

//Set the values
Set<String> set = new HashSet<String>();
set.addAll(listOfExistingScores);
scoreEditor.putStringSet("key", set);
scoreEditor.commit();

Vous pouvez également sérialiser votre liste de tableaux et ensuite enregistrer/lire/à partir de SharedPreferences. Ci-dessous est la solution:

EDIT: Ok, voici la solution pour sauver ArrayList comme objet sérialisé à SharedPreferences puis le lire à partir de SharedPreferences.

Parce que l'API prend en charge uniquement le stockage et la récupération de chaînes à/à partir de SharedPreferences (après API 11, sa plus simple), nous avons pour sérialiser et désérialiser l'objet ArrayList qui a la liste des tâches dans la chaîne.

Dans l' addTask() méthode de la TaskManagerApplication classe, nous devons obtenir de l'instance de partage de préférence et ensuite le stocker sérialisé liste de tableaux à l'aide de l' putString() méthode:

public void addTask(Task t) {
        if (null == currentTasks) {
            currentTasks = new ArrayList<task>();
        }
        currentTasks.add(t);

        //save the task list to preference
        SharedPreferences prefs = getSharedPreferences(SHARED_PREFS_FILE, Context.MODE_PRIVATE);
        Editor editor = prefs.edit();
        try {
            editor.putString(TASKS, ObjectSerializer.serialize(currentTasks));
        } catch (IOException e) {
            e.printStackTrace();
        }
        editor.commit();
    }

De même, nous avons à récupérer la liste des tâches à partir de la préférence dans l' onCreate() méthode:

public void onCreate() {
        super.onCreate();
        if (null == currentTasks) {
            currentTasks = new ArrayList<task>();
        }

        //      load tasks from preference
        SharedPreferences prefs = getSharedPreferences(SHARED_PREFS_FILE, Context.MODE_PRIVATE);

        try {
            currentTasks = (ArrayList<task>) ObjectSerializer.deserialize(prefs.getString(TASKS, ObjectSerializer.serialize(new ArrayList<task>())));
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

Vous pouvez obtenir ObjectSerializer classe de Apache Pig projet ObjectSerializer.java

123voto

kc ochibili Points 321
<p>À l’aide de cet objet--> <a href="https://github.com/kcochibili/TinyDB--Android-Shared-Preferences-Turbo">TinyDB--Android-partagé-préférences-Turbo</a> de son très simple.<pre><code></code></pre><p>pour mettre</p><pre><code></code></pre><p>pour obtenir</p><pre><code></code></pre></p>

93voto

Preet Points 1316
<p>Sauver le tableau dans les préférences partagées<pre><code></code></pre><p>Chargement des données de tableau de préférences partagées</p><pre><code></code></pre></p>

64voto

MByD Points 78505
<p>Vous pouvez convertir en chaîne au format JSON et stocker la chaîne dans les préférences partagés.</p>

5voto

Winston Smith Points 346

Le meilleur moyen est de convertir en chaîne JSOn en utilisant GSON et de sauvegarder cette chaîne dans SharedPreference. J'utilise également cette méthode pour mettre en cache les réponses.

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