376 Stimmen

ArrayList in SharedPreferences speichern

Ich habe eine ArrayList mit benutzerdefinierten Objekten. Jedes benutzerdefinierte Objekt enthält eine Vielzahl von Zeichenfolgen und Zahlen. Ich benötige das Array auch dann, wenn der Benutzer die Aktivität verlässt und zu einem späteren Zeitpunkt zurückkehren möchte, aber ich brauche das Array nicht, wenn die Anwendung vollständig geschlossen wurde. Ich speichere eine Menge anderer Objekte auf diese Weise, indem ich die SharedPreferences aber ich kann nicht herausfinden, wie ich mein gesamtes Array auf diese Weise speichern kann. Ist das möglich? Vielleicht SharedPreferences ist nicht der richtige Weg, dies zu tun? Gibt es eine einfachere Methode?

9voto

Andrey Tuzov Punkte 111

Auch mit Kotlin:

fun SharedPreferences.Editor.putIntegerArrayList(key: String, list: ArrayList<Int>?): SharedPreferences.Editor {
    putString(key, list?.joinToString(",") ?: "")
    return this
}

fun SharedPreferences.getIntegerArrayList(key: String, defValue: ArrayList<Int>?): ArrayList<Int>? {
    val value = getString(key, null)
    if (value.isNullOrBlank())
        return defValue
    return ArrayList (value.split(",").map { it.toInt() }) 
}

7voto

Paras Santoki Punkte 771

Sie können String und benutzerdefinierte Array-Liste mit Gson-Bibliothek speichern.

\=>Zuerst müssen Sie eine Funktion zum Speichern der Array-Liste in SharedPreferences erstellen.

public void saveListInLocal(ArrayList<String> list, String key) {

        SharedPreferences prefs = getSharedPreferences("AppName", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = prefs.edit();
        Gson gson = new Gson();
        String json = gson.toJson(list);
        editor.putString(key, json);
        editor.apply();     // This line is IMPORTANT !!!

    }

\=> Sie müssen eine Funktion erstellen, um die Array-Liste von SharedPreferences zu erhalten.

public ArrayList<String> getListFromLocal(String key)
{
    SharedPreferences prefs = getSharedPreferences("AppName", Context.MODE_PRIVATE);
    Gson gson = new Gson();
    String json = prefs.getString(key, null);
    Type type = new TypeToken<ArrayList<String>>() {}.getType();
    return gson.fromJson(json, type);

}

\=> So rufen Sie die Funktion zum Speichern und Abrufen von Array-Listen auf.

ArrayList<String> listSave=new ArrayList<>();
listSave.add("test1"));
listSave.add("test2"));
saveListInLocal(listSave,"key");
Log.e("saveArrayList:","Save ArrayList success");
ArrayList<String> listGet=new ArrayList<>();
listGet=getListFromLocal("key");
Log.e("getArrayList:","Get ArrayList size"+listGet.size());

\=> Vergessen Sie nicht, die gson-Bibliothek in Ihre App-Ebene build.gradle hinzuzufügen.

Implementierung 'com.google.code.gson:gson:2.8.2'

6voto

Winston Punkte 1750

Der beste Weg ist die Konvertierung in einen JSOn-String mit GSON und das Speichern dieses Strings in SharedPreference. Ich verwende diese Methode auch, um Antworten zwischenzuspeichern.

5voto

Khemraj Sharma Punkte 52006

Ich habe alle obigen Antworten gelesen. Das ist alles richtig, aber ich fand eine einfachere Lösung wie unten:

  1. Speichern der Zeichenkettenliste in der gemeinsamen Präferenz>>

    public static void setSharedPreferenceStringList(Context pContext, String pKey, List<String> pData) {
    SharedPreferences.Editor editor = pContext.getSharedPreferences(Constants.APP_PREFS, Activity.MODE_PRIVATE).edit();
    editor.putInt(pKey + "size", pData.size());
    editor.commit();
    
    for (int i = 0; i < pData.size(); i++) {
        SharedPreferences.Editor editor1 = pContext.getSharedPreferences(Constants.APP_PREFS, Activity.MODE_PRIVATE).edit();
        editor1.putString(pKey + i, (pData.get(i)));
        editor1.commit();
    }

    }

  2. und für das Abrufen der String-Liste von Shared-preference>>

    public static List<String> getSharedPreferenceStringList(Context pContext, String pKey) {
    int size = pContext.getSharedPreferences(Constants.APP_PREFS, Activity.MODE_PRIVATE).getInt(pKey + "size", 0);
    List<String> list = new ArrayList<>();
    for (int i = 0; i < size; i++) {
        list.add(pContext.getSharedPreferences(Constants.APP_PREFS, Activity.MODE_PRIVATE).getString(pKey + i, ""));
    }
    return list;
    }

Hier Constants.APP_PREFS ist der Name der zu öffnenden Datei; darf keine Pfadseparatoren enthalten.

4voto

André Ramon Punkte 2131

Verwendung von Kotlin und GSON:

fun <T> SharedPreferences.writeList(gson: Gson, key: String, data: List<T>) {
    val json = gson.toJson(data)
    edit { putString(key, json) }
}

inline fun <reified T> SharedPreferences.readList(gson: Gson, key: String): List<T> {
    val json = getString(key, "[]") ?: "[]"
    val type = object : TypeToken<List<T>>() {}.type

    return try {
        gson.fromJson(json, type)
    } catch(e: JsonSyntaxException) {
        emptyList()
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X