Speichern Sie ArrayList in SharedPreferences


316

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



Dies ist das vollständige Beispiel durch die URL stackoverflow.com/a/41137562/4344659
Sanjeev Sangral

Wenn jemand nach einer Lösung sucht, ist dies möglicherweise die Antwort, die Sie mit einem vollständigen Verwendungsbeispiel in Kotlin suchen. stackoverflow.com/a/56873719/3710341
Sagar Chapagain

Antworten:


431

Nach API 11 wird SharedPreferences Editorakzeptiert Sets. Sie können Ihre Liste in eine HashSetoder etwas Ähnliches konvertieren und so speichern. Wenn Sie es zurückgelesen haben, konvertieren Sie es in ein ArrayList, sortieren Sie es bei Bedarf und Sie können loslegen.

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

Sie können Ihre auch serialisieren ArrayListund dann in / von speichern / lesen SharedPreferences. Unten ist die Lösung:

BEARBEITEN:
Ok, unten ist die Lösung, um sie ArrayListals serialisiertes Objekt zu speichern SharedPreferencesund dann aus SharedPreferences zu lesen.

Da die API nur das Speichern und Abrufen von Zeichenfolgen in / aus SharedPreferences unterstützt (nach API 11 ist dies einfacher), müssen wir das ArrayList-Objekt mit der Liste der Aufgaben in Zeichenfolgen serialisieren und de-serialisieren.

In der addTask()Methode der TaskManagerApplication-Klasse müssen wir die Instanz der gemeinsam genutzten Voreinstellung abrufen und dann die serialisierte ArrayList mit der folgenden putString()Methode speichern :

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

Ebenso müssen wir die Liste der Aufgaben aus der Voreinstellung in der onCreate()Methode abrufen :

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

Sie können die ObjectSerializerKlasse aus dem Apache Pig-Projekt ObjectSerializer.java abrufen


21
Beachten Sie, dass dies putStringSetbei API 11 hinzugefügt wurde. Die meisten aktuellen Programmierer zielen auf Lease-API 8 (Froyo) ab.
Cristian

2
Ich mag die Idee dieser Methode, weil sie am saubersten zu sein scheint, aber das Array, das ich speichern möchte, ist ein benutzerdefiniertes Klassenobjekt, das Zeichenfolgen, Doubles und Boolesche Werte enthält. Wie füge ich einem Set alle drei Typen hinzu? Muss ich jedes einzelne Objekt auf ein eigenes Array setzen und es dann einzeln zu separaten Sets hinzufügen, bevor ich es speichere, oder gibt es einen einfacheren Weg?
Ryandlf

5
Was ist scoreEditor?
Ruchir Baronia

2
An die Leser nach Okt. 2016: Dieser Kommentar erhält bereits viel Aufsehen und Sie können ihn wie mich verwenden, aber bitte halten Sie an und tun Sie dies nicht. HashSet verwirft doppelte Werte, sodass Ihre ArrayList nicht identisch ist. Details hier: stackoverflow.com/questions/12940663/…
Seoul

2
Zur Erinnerung an diejenigen, die auf diese Antwort stoßen: Ein Set ist ungeordnet, sodass beim Speichern eines StringSets die Reihenfolge verloren geht, die Sie mit Ihrer ArrayList hatten.
David Liu

119

Mit diesem Objekt -> TinyDB - Android-Shared-Preferences-Turbo ist es sehr einfach.

TinyDB tinydb = new TinyDB(context);

stellen

tinydb.putList("MyUsers", mUsersArray);

bekommen

tinydb.getList("MyUsers");

AKTUALISIEREN

Einige nützliche Beispiele und Fehlerbehebungen finden Sie hier: Android Shared Preference TinyDB putListObject-Funktion


6
Dies ist der beste Ansatz. +1 von meiner Seite
Sritam Jagadev

3
Ich auch. Sehr nützlich !!
Juan Aguilar Guisado

1
Abhängig vom Inhalt Ihrer Liste müssen Sie beim Aufrufen den Objekttyp Ihrer Liste angeben. tinydb.putList()Schauen Sie sich die Beispiele auf der verlinkten Seite an.
kc ochibili

gute lib, aber ich sollte erwähnen, dass diese Bibliothek manchmal Probleme beim Speichern von Objekten hat. Um genauer zu sein, kann es zu einer Stapelüberlaufausnahme kommen. und ich denke, es liegt daran, dass es Reflexion verwendet, um herauszufinden, wie das Objekt gespeichert werden soll, und wenn das Objekt zu kompliziert wird, kann es diese Ausnahme auslösen.
Mr.Q

1
Liebe dich so sehr!
Mychemicalro

93

Speichern Arrayin SharedPreferences:

public static boolean saveArray()
{
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
    SharedPreferences.Editor mEdit1 = sp.edit();
    /* sKey is an array */
    mEdit1.putInt("Status_size", sKey.size());  

    for(int i=0;i<sKey.size();i++)  
    {
        mEdit1.remove("Status_" + i);
        mEdit1.putString("Status_" + i, sKey.get(i));  
    }

    return mEdit1.commit();     
}

Laden von ArrayDaten ausSharedPreferences

public static void loadArray(Context mContext)
{  
    SharedPreferences mSharedPreference1 =   PreferenceManager.getDefaultSharedPreferences(mContext);
    sKey.clear();
    int size = mSharedPreference1.getInt("Status_size", 0);  

    for(int i=0;i<size;i++) 
    {
     sKey.add(mSharedPreference1.getString("Status_" + i, null));
    }

}

14
Das ist ein sehr schöner "Hack". Beachten Sie, dass bei dieser Methode die SharedPreferences immer mit nicht verwendeten alten Werten aufgebläht werden können. Beispielsweise kann eine Liste bei einem Lauf eine Größe von 100 und dann eine Größe von 50 haben. Die 50 alten Einträge bleiben in den Einstellungen erhalten. Eine Möglichkeit besteht darin, einen MAX-Wert festzulegen und alles bis dahin zu löschen.
Iraklis

3
@Iraklis Tatsächlich aber davon aus, dass Sie speichern nur diese ArrayListin SharedPrefenecesSie könnten verwenden , mEdit1.clear()dies zu vermeiden.
AlexAndro

1
Ich mag diesen "Hack". Aber mEdit1.clear () löscht andere Werte, die für diesen Zweck nicht relevant sind?
Bagusflyer

1
Vielen Dank! Wenn es Ihnen etwas ausmacht, wenn ich Sie frage, gibt es einen notwendigen Zweck für .remove ()? Wird die Präferenz nicht trotzdem einfach überschrieben?
Script Kitty

62

Sie können es in konvertieren JSON Stringund die Zeichenfolge in der speichern SharedPreferences.


Ich finde eine Menge Code zum Konvertieren von ArrayLists in JSONArrays, aber haben Sie ein Beispiel, das Sie möglicherweise teilen möchten, wie Sie in JSONString konvertieren, damit ich es in den SharedPrefs speichern kann?
Ryandlf

5
using toString ()
MByD

3
Aber wie bekomme ich es dann wieder aus SharedPrefs heraus und konvertiere es zurück in eine ArrayList?
Ryandlf

Es tut mir leid, ich habe kein Android SDK, um es jetzt zu testen, aber schauen Sie hier: benjii.me/2010/04/deserializing-json-in-android-using-gson . Sie sollten das json-Array durchlaufen und dort für jedes Objekt das tun, was sie dort tun. Hoffentlich kann ich morgen eine Bearbeitung meiner Antwort mit einem vollständigen Beispiel veröffentlichen.
MByD

53

Wie @nirav sagte, ist die beste Lösung, es in sharedPrefernces als JSON-Text unter Verwendung der Gson-Dienstprogrammklasse zu speichern. Unten Beispielcode:

//Retrieve the values
Gson gson = new Gson();
String jsonText = Prefs.getString("key", null);
String[] text = gson.fromJson(jsonText, String[].class);  //EDIT: gso to gson


//Set the values
Gson gson = new Gson();
List<String> textList = new ArrayList<String>();
textList.addAll(data);
String jsonText = gson.toJson(textList);
prefsEditor.putString("key", jsonText);
prefsEditor.apply();

2
Gott sei Dank, das war ein Lebensretter. Sehr einfach.
Parthiban M

2
Diese Antwort sollte weit oben sein. Hervorragend! Ich hatte keine Ahnung, dass ich Gson so verwenden kann. Zum ersten Mal wird die Array-Notation auch auf diese Weise verwendet. Vielen Dank!
Madu

3
Um es wieder in List zu konvertieren, List <String> textList = Arrays.asList (gson.fromJson (jsonText, String []. Class));
Vamsi Challa

22

Hey Freunde, ich habe die Lösung des obigen Problems ohne Verwendung bekommen Gson Bibliothek . Hier poste ich Quellcode.

1.Variable Erklärung dh

  SharedPreferences shared;
  ArrayList<String> arrPackage;

2.Variable Initialisierung dh

 shared = getSharedPreferences("App_settings", MODE_PRIVATE);
 // add values for your ArrayList any where...
 arrPackage = new ArrayList<>();

3.Speichern Sie den Wert in sharedPreference mit packagesharedPreferences():

 private void packagesharedPreferences() {
   SharedPreferences.Editor editor = shared.edit();
   Set<String> set = new HashSet<String>();
   set.addAll(arrPackage);
   editor.putStringSet("DATE_LIST", set);
   editor.apply();
   Log.d("storesharedPreferences",""+set);
 }

4.Wiederholen Sie den Wert von sharedPreference mit retriveSharedValue():

 private void retriveSharedValue() {
   Set<String> set = shared.getStringSet("DATE_LIST", null);
   arrPackage.addAll(set);
   Log.d("retrivesharedPreferences",""+set);
 }

Ich hoffe es wird hilfreich für dich ...


tolle Lösung! einfach und schnell!
LoveAndroid

5
Dadurch werden alle doppelten Zeichenfolgen aus der Liste entfernt, sobald Sie sie einem Satz hinzufügen. Wahrscheinlich keine gesuchte Funktion
OneCricketeer

Ist es nur für eine Liste von Strings?
CoolMind

Auf diese Weise verlieren Sie die Ordnung
Brian Reinhold

16
/**
 *     Save and get ArrayList in SharedPreference
 */

JAVA:

public void saveArrayList(ArrayList<String> list, String key){
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
    SharedPreferences.Editor editor = prefs.edit();
    Gson gson = new Gson();
    String json = gson.toJson(list);
    editor.putString(key, json);
    editor.apply();    

}

public ArrayList<String> getArrayList(String key){
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
    Gson gson = new Gson();
    String json = prefs.getString(key, null);
    Type type = new TypeToken<ArrayList<String>>() {}.getType();
    return gson.fromJson(json, type);
}

Kotlin

fun saveArrayList(list: java.util.ArrayList<String?>?, key: String?) {
    val prefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(activity)
    val editor: Editor = prefs.edit()
    val gson = Gson()
    val json: String = gson.toJson(list)
    editor.putString(key, json)
    editor.apply()
}

fun getArrayList(key: String?): java.util.ArrayList<String?>? {
    val prefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(activity)
    val gson = Gson()
    val json: String = prefs.getString(key, null)
    val type: Type = object : TypeToken<java.util.ArrayList<String?>?>() {}.getType()
    return gson.fromJson(json, type)
}

1
Ja, beste Antwort
AlexPad

Dies ist die beste Antwort. Ich habe sie auch zum Speichern anderer Objekte verwendet
Irfandi D. Vendy,

Können Sie dies so machen, dass alle Modellklassen gespeichert werden?
BlackBlind

13

Mit Android SharedPreferances können Sie primitive Typen (Boolean, Float, Int, Long, String und StringSet, die seit API11 verfügbar sind) als XML-Datei im Speicher speichern.

Die Schlüsselidee jeder Lösung wäre, die Daten in einen dieser primitiven Typen zu konvertieren.

Ich persönlich liebe es, meine Liste in das JSON-Format zu konvertieren und sie dann als Zeichenfolge in einem SharedPreferences-Wert zu speichern.

Um meine Lösung verwenden zu können, müssen Sie Google Gson hinzufügen lib .

Fügen Sie in gradle einfach die folgende Abhängigkeit hinzu (verwenden Sie bitte die neueste Version von Google):

compile 'com.google.code.gson:gson:2.6.2'

Daten speichern (wobei HttpParam Ihr Objekt ist):

List<HttpParam> httpParamList = "**get your list**"
String httpParamJSONList = new Gson().toJson(httpParamList);

SharedPreferences prefs = getSharedPreferences(**"your_prefes_key"**, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString(**"your_prefes_key"**, httpParamJSONList);

editor.apply();

Daten abrufen (wobei HttpParam Ihr Objekt ist):

SharedPreferences prefs = getSharedPreferences(**"your_prefes_key"**, Context.MODE_PRIVATE);
String httpParamJSONList = prefs.getString(**"your_prefes_key"**, ""); 

List<HttpParam> httpParamList =  
new Gson().fromJson(httpParamJSONList, new TypeToken<List<HttpParam>>() {
            }.getType());

Vielen Dank. Diese Antwort hat mir geholfen, meine Liste <MyObject> abzurufen und zu speichern.
Visrahane

Vielen Dank. Funktioniert gut
Velayutham M

11

Dies ist Ihre perfekte Lösung. Probieren Sie es aus,

public void saveArrayList(ArrayList<String> list, String key){
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
    SharedPreferences.Editor editor = prefs.edit();
    Gson gson = new Gson();
    String json = gson.toJson(list);
    editor.putString(key, json);
    editor.apply();     // This line is IMPORTANT !!!
}

public ArrayList<String> getArrayList(String key){
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
    Gson gson = new Gson();
    String json = prefs.getString(key, null);
    Type type = new TypeToken<ArrayList<String>>() {}.getType();
    return gson.fromJson(json, type);
}

9

Sie können die Arrayliste auch in einen String konvertieren und diesen vorzugsweise speichern

private String convertToString(ArrayList<String> list) {

            StringBuilder sb = new StringBuilder();
            String delim = "";
            for (String s : list)
            {
                sb.append(delim);
                sb.append(s);;
                delim = ",";
            }
            return sb.toString();
        }

private ArrayList<String> convertToArray(String string) {

            ArrayList<String> list = new ArrayList<String>(Arrays.asList(string.split(",")));
            return list;
        }

Sie können die Arrayliste speichern, nachdem Sie sie mit der convertToStringMethode in einen String konvertiert haben. Sie können den String abrufen und mit in ein Array konvertierenconvertToArray

Nach API 11 können Sie den Satz jedoch direkt in SharedPreferences speichern !!! :) :)


6

Für String, int, boolean ist sharedPreferences die beste Wahl.

Wenn Sie ArrayList oder komplexe Daten speichern möchten. Die beste Wahl wäre die Papierbibliothek.

Abhängigkeit hinzufügen

implementation 'io.paperdb:paperdb:2.6'

Papier initialisieren

Sollte einmal in Application.onCreate () initialisiert werden:

Paper.init(context);

speichern

List<Person> contacts = ...
Paper.book().write("contacts", contacts);

Lade Daten

Verwenden Sie Standardwerte, wenn das Objekt nicht im Speicher vorhanden ist.

List<Person> contacts = Paper.book().read("contacts", new ArrayList<>());

Bitte schön.

https://github.com/pilgr/Paper


5

Ich habe alle Antworten oben gelesen. Das ist alles richtig, aber ich habe eine einfachere Lösung gefunden:

  1. Speichern der Zeichenfolgenliste in den gemeinsam genutzten Einstellungen >>

    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 zum 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_PREFSist der Name der zu öffnenden Datei. darf keine Pfadtrennzeichen enthalten.


5

Auch bei 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() }) 
}

4

Am besten konvertieren Sie mit GSON in eine JSOn-Zeichenfolge und speichern diese Zeichenfolge in SharedPreference. Ich benutze diese Methode auch, um Antworten zwischenzuspeichern.


4

Sie können String- und benutzerdefinierte Array-Listen mithilfe der Gson-Bibliothek speichern.

=> Zuerst müssen Sie eine Funktion erstellen, um die Array-Liste in SharedPreferences zu speichern.

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 eine Array-Liste von SharedPreferences abzurufen.

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 build.gradle auf App-Ebene hinzuzufügen.

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


3

Sie können auf die Funktionen serializeKey () und deserializeKey () aus der SharedPreferencesTokenCache-Klasse von FacebookSDK verweisen. Es konvertiert den unterstützten Typ in das JSON-Objekt und speichert die JSON-Zeichenfolge in SharedPreferences . Sie können das SDK hier herunterladen

private void serializeKey(String key, Bundle bundle, SharedPreferences.Editor editor)
    throws JSONException {
    Object value = bundle.get(key);
    if (value == null) {
        // Cannot serialize null values.
        return;
    }

    String supportedType = null;
    JSONArray jsonArray = null;
    JSONObject json = new JSONObject();

    if (value instanceof Byte) {
        supportedType = TYPE_BYTE;
        json.put(JSON_VALUE, ((Byte)value).intValue());
    } else if (value instanceof Short) {
        supportedType = TYPE_SHORT;
        json.put(JSON_VALUE, ((Short)value).intValue());
    } else if (value instanceof Integer) {
        supportedType = TYPE_INTEGER;
        json.put(JSON_VALUE, ((Integer)value).intValue());
    } else if (value instanceof Long) {
        supportedType = TYPE_LONG;
        json.put(JSON_VALUE, ((Long)value).longValue());
    } else if (value instanceof Float) {
        supportedType = TYPE_FLOAT;
        json.put(JSON_VALUE, ((Float)value).doubleValue());
    } else if (value instanceof Double) {
        supportedType = TYPE_DOUBLE;
        json.put(JSON_VALUE, ((Double)value).doubleValue());
    } else if (value instanceof Boolean) {
        supportedType = TYPE_BOOLEAN;
        json.put(JSON_VALUE, ((Boolean)value).booleanValue());
    } else if (value instanceof Character) {
        supportedType = TYPE_CHAR;
        json.put(JSON_VALUE, value.toString());
    } else if (value instanceof String) {
        supportedType = TYPE_STRING;
        json.put(JSON_VALUE, (String)value);
    } else {
        // Optimistically create a JSONArray. If not an array type, we can null
        // it out later
        jsonArray = new JSONArray();
        if (value instanceof byte[]) {
            supportedType = TYPE_BYTE_ARRAY;
            for (byte v : (byte[])value) {
                jsonArray.put((int)v);
            }
        } else if (value instanceof short[]) {
            supportedType = TYPE_SHORT_ARRAY;
            for (short v : (short[])value) {
                jsonArray.put((int)v);
            }
        } else if (value instanceof int[]) {
            supportedType = TYPE_INTEGER_ARRAY;
            for (int v : (int[])value) {
                jsonArray.put(v);
            }
        } else if (value instanceof long[]) {
            supportedType = TYPE_LONG_ARRAY;
            for (long v : (long[])value) {
                jsonArray.put(v);
            }
        } else if (value instanceof float[]) {
            supportedType = TYPE_FLOAT_ARRAY;
            for (float v : (float[])value) {
                jsonArray.put((double)v);
            }
        } else if (value instanceof double[]) {
            supportedType = TYPE_DOUBLE_ARRAY;
            for (double v : (double[])value) {
                jsonArray.put(v);
            }
        } else if (value instanceof boolean[]) {
            supportedType = TYPE_BOOLEAN_ARRAY;
            for (boolean v : (boolean[])value) {
                jsonArray.put(v);
            }
        } else if (value instanceof char[]) {
            supportedType = TYPE_CHAR_ARRAY;
            for (char v : (char[])value) {
                jsonArray.put(String.valueOf(v));
            }
        } else if (value instanceof List<?>) {
            supportedType = TYPE_STRING_LIST;
            @SuppressWarnings("unchecked")
            List<String> stringList = (List<String>)value;
            for (String v : stringList) {
                jsonArray.put((v == null) ? JSONObject.NULL : v);
            }
        } else {
            // Unsupported type. Clear out the array as a precaution even though
            // it is redundant with the null supportedType.
            jsonArray = null;
        }
    }

    if (supportedType != null) {
        json.put(JSON_VALUE_TYPE, supportedType);
        if (jsonArray != null) {
            // If we have an array, it has already been converted to JSON. So use
            // that instead.
            json.putOpt(JSON_VALUE, jsonArray);
        }

        String jsonString = json.toString();
        editor.putString(key, jsonString);
    }
}

private void deserializeKey(String key, Bundle bundle)
        throws JSONException {
    String jsonString = cache.getString(key, "{}");
    JSONObject json = new JSONObject(jsonString);

    String valueType = json.getString(JSON_VALUE_TYPE);

    if (valueType.equals(TYPE_BOOLEAN)) {
        bundle.putBoolean(key, json.getBoolean(JSON_VALUE));
    } else if (valueType.equals(TYPE_BOOLEAN_ARRAY)) {
        JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
        boolean[] array = new boolean[jsonArray.length()];
        for (int i = 0; i < array.length; i++) {
            array[i] = jsonArray.getBoolean(i);
        }
        bundle.putBooleanArray(key, array);
    } else if (valueType.equals(TYPE_BYTE)) {
        bundle.putByte(key, (byte)json.getInt(JSON_VALUE));
    } else if (valueType.equals(TYPE_BYTE_ARRAY)) {
        JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
        byte[] array = new byte[jsonArray.length()];
        for (int i = 0; i < array.length; i++) {
            array[i] = (byte)jsonArray.getInt(i);
        }
        bundle.putByteArray(key, array);
    } else if (valueType.equals(TYPE_SHORT)) {
        bundle.putShort(key, (short)json.getInt(JSON_VALUE));
    } else if (valueType.equals(TYPE_SHORT_ARRAY)) {
        JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
        short[] array = new short[jsonArray.length()];
        for (int i = 0; i < array.length; i++) {
            array[i] = (short)jsonArray.getInt(i);
        }
        bundle.putShortArray(key, array);
    } else if (valueType.equals(TYPE_INTEGER)) {
        bundle.putInt(key, json.getInt(JSON_VALUE));
    } else if (valueType.equals(TYPE_INTEGER_ARRAY)) {
        JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
        int[] array = new int[jsonArray.length()];
        for (int i = 0; i < array.length; i++) {
            array[i] = jsonArray.getInt(i);
        }
        bundle.putIntArray(key, array);
    } else if (valueType.equals(TYPE_LONG)) {
        bundle.putLong(key, json.getLong(JSON_VALUE));
    } else if (valueType.equals(TYPE_LONG_ARRAY)) {
        JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
        long[] array = new long[jsonArray.length()];
        for (int i = 0; i < array.length; i++) {
            array[i] = jsonArray.getLong(i);
        }
        bundle.putLongArray(key, array);
    } else if (valueType.equals(TYPE_FLOAT)) {
        bundle.putFloat(key, (float)json.getDouble(JSON_VALUE));
    } else if (valueType.equals(TYPE_FLOAT_ARRAY)) {
        JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
        float[] array = new float[jsonArray.length()];
        for (int i = 0; i < array.length; i++) {
            array[i] = (float)jsonArray.getDouble(i);
        }
        bundle.putFloatArray(key, array);
    } else if (valueType.equals(TYPE_DOUBLE)) {
        bundle.putDouble(key, json.getDouble(JSON_VALUE));
    } else if (valueType.equals(TYPE_DOUBLE_ARRAY)) {
        JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
        double[] array = new double[jsonArray.length()];
        for (int i = 0; i < array.length; i++) {
            array[i] = jsonArray.getDouble(i);
        }
        bundle.putDoubleArray(key, array);
    } else if (valueType.equals(TYPE_CHAR)) {
        String charString = json.getString(JSON_VALUE);
        if (charString != null && charString.length() == 1) {
            bundle.putChar(key, charString.charAt(0));
        }
    } else if (valueType.equals(TYPE_CHAR_ARRAY)) {
        JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
        char[] array = new char[jsonArray.length()];
        for (int i = 0; i < array.length; i++) {
            String charString = jsonArray.getString(i);
            if (charString != null && charString.length() == 1) {
                array[i] = charString.charAt(0);
            }
        }
        bundle.putCharArray(key, array);
    } else if (valueType.equals(TYPE_STRING)) {
        bundle.putString(key, json.getString(JSON_VALUE));
    } else if (valueType.equals(TYPE_STRING_LIST)) {
        JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
        int numStrings = jsonArray.length();
        ArrayList<String> stringList = new ArrayList<String>(numStrings);
        for (int i = 0; i < numStrings; i++) {
            Object jsonStringValue = jsonArray.get(i);
            stringList.add(i, jsonStringValue == JSONObject.NULL ? null : (String)jsonStringValue);
        }
        bundle.putStringArrayList(key, stringList);
    }
}

2

Warum steckst du deine Arrayliste nicht in eine Anwendungsklasse? Es wird nur zerstört, wenn die App wirklich getötet wird. Es bleibt also so lange bestehen, wie die App verfügbar ist.


5
Was passiert, wenn die Anwendung erneut gestartet wird?
Manohar Perepa

2

Der beste Weg, den ich finden konnte, ist, ein 2D-Array von Schlüsseln zu erstellen und die benutzerdefinierten Elemente des Arrays in das 2-D-Array von Schlüsseln einzufügen und sie dann beim Start über das 2D-Arra abzurufen. Die Idee, ein String-Set zu verwenden, gefiel mir nicht, da die meisten Android-Benutzer immer noch Lebkuchen verwenden und für das Verwenden eines String-Sets Waben erforderlich sind.

Beispielcode: Hier ist Ditor der gemeinsam genutzte Pref-Editor und Rowitem ist mein benutzerdefiniertes Objekt.

editor.putString(genrealfeedkey[j][1], Rowitemslist.get(j).getname());
        editor.putString(genrealfeedkey[j][2], Rowitemslist.get(j).getdescription());
        editor.putString(genrealfeedkey[j][3], Rowitemslist.get(j).getlink());
        editor.putString(genrealfeedkey[j][4], Rowitemslist.get(j).getid());
        editor.putString(genrealfeedkey[j][5], Rowitemslist.get(j).getmessage());

2

Der folgende Code ist die akzeptierte Antwort, mit ein paar weiteren Zeilen für neue Leute (mich), z. zeigt, wie das Objekt vom Typ set wieder in arrayList konvertiert wird, und zusätzliche Anleitungen zu den Vorgängen '.putStringSet' und '.getStringSet'. (Danke, Böse)

// shared preferences
   private SharedPreferences preferences;
   private SharedPreferences.Editor nsuserdefaults;

// setup persistent data
        preferences = this.getSharedPreferences("MyPreferences", MainActivity.MODE_PRIVATE);
        nsuserdefaults = preferences.edit();

        arrayOfMemberUrlsUserIsFollowing = new ArrayList<String>();
        //Retrieve followers from sharedPreferences
        Set<String> set = preferences.getStringSet("following", null);

        if (set == null) {
            // lazy instantiate array
            arrayOfMemberUrlsUserIsFollowing = new ArrayList<String>();
        } else {
            // there is data from previous run
            arrayOfMemberUrlsUserIsFollowing = new ArrayList<>(set);
        }

// convert arraylist to set, and save arrayOfMemberUrlsUserIsFollowing to nsuserdefaults
                Set<String> set = new HashSet<String>();
                set.addAll(arrayOfMemberUrlsUserIsFollowing);
                nsuserdefaults.putStringSet("following", set);
                nsuserdefaults.commit();

2
//Set the values
intent.putParcelableArrayListExtra("key",collection);

//Retrieve the values
ArrayList<OnlineMember> onlineMembers = data.getParcelableArrayListExtra("key");


2

Sie können die Serialisierung oder die Gson-Bibliothek verwenden, um die Liste in einen String umzuwandeln und umgekehrt, und dann den String in den Einstellungen speichern.

Verwenden der Gson-Bibliothek von Google:

//Converting list to string
new Gson().toJson(list);

//Converting string to list
new Gson().fromJson(listString, CustomObjectsList.class);

Verwenden der Java-Serialisierung:

//Converting list to string
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(list);
oos.flush();
String string = Base64.encodeToString(bos.toByteArray(), Base64.DEFAULT);
oos.close();
bos.close();
return string;

//Converting string to list
byte[] bytesArray = Base64.decode(familiarVisitsString, Base64.DEFAULT);
ByteArrayInputStream bis = new ByteArrayInputStream(bytesArray);
ObjectInputStream ois = new ObjectInputStream(bis);
Object clone = ois.readObject();
ois.close();
bis.close();
return (CustomObjectsList) clone;

2

Diese Methode wird zum Speichern / Speichern der Array-Liste verwendet: -

 public static void saveSharedPreferencesLogList(Context context, List<String> collageList) {
            SharedPreferences mPrefs = context.getSharedPreferences("PhotoCollage", context.MODE_PRIVATE);
            SharedPreferences.Editor prefsEditor = mPrefs.edit();
            Gson gson = new Gson();
            String json = gson.toJson(collageList);
            prefsEditor.putString("myJson", json);
            prefsEditor.commit();
        }

Diese Methode wird verwendet, um die Array-Liste abzurufen: -

public static List<String> loadSharedPreferencesLogList(Context context) {
        List<String> savedCollage = new ArrayList<String>();
        SharedPreferences mPrefs = context.getSharedPreferences("PhotoCollage", context.MODE_PRIVATE);
        Gson gson = new Gson();
        String json = mPrefs.getString("myJson", "");
        if (json.isEmpty()) {
            savedCollage = new ArrayList<String>();
        } else {
            Type type = new TypeToken<List<String>>() {
            }.getType();
            savedCollage = gson.fromJson(json, type);
        }

        return savedCollage;
    }

1

Sie können es in ein MapObjekt konvertieren, um es zu speichern, und dann die Werte wieder in eine ArrayList ändern, wenn Sie das abrufen SharedPreferences.


1

Verwenden Sie diese benutzerdefinierte Klasse:

public class SharedPreferencesUtil {

    public static void pushStringList(SharedPreferences sharedPref, 
                                      List<String> list, String uniqueListName) {

        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putInt(uniqueListName + "_size", list.size());

        for (int i = 0; i < list.size(); i++) {
            editor.remove(uniqueListName + i);
            editor.putString(uniqueListName + i, list.get(i));
        }
        editor.apply();
    }

    public static List<String> pullStringList(SharedPreferences sharedPref, 
                                              String uniqueListName) {

        List<String> result = new ArrayList<>();
        int size = sharedPref.getInt(uniqueListName + "_size", 0);

        for (int i = 0; i < size; i++) {
            result.add(sharedPref.getString(uniqueListName + i, null));
        }
        return result;
    }
}

Wie benutzt man:

SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
SharedPreferencesUtil.pushStringList(sharedPref, list, getString(R.string.list_name));
List<String> list = SharedPreferencesUtil.pullStringList(sharedPref, getString(R.string.list_name));

1

das sollte funktionieren:

public void setSections (Context c,  List<Section> sectionList){
    this.sectionList = sectionList;

    Type sectionListType = new TypeToken<ArrayList<Section>>(){}.getType();
    String sectionListString = new Gson().toJson(sectionList,sectionListType);

    SharedPreferences.Editor editor = getSharedPreferences(c).edit().putString(PREFS_KEY_SECTIONS, sectionListString);
    editor.apply();
}

sie, um es nur zu fangen:

public List<Section> getSections(Context c){

    if(this.sectionList == null){
        String sSections = getSharedPreferences(c).getString(PREFS_KEY_SECTIONS, null);

        if(sSections == null){
            return new ArrayList<>();
        }

        Type sectionListType = new TypeToken<ArrayList<Section>>(){}.getType();
        try {

            this.sectionList = new Gson().fromJson(sSections, sectionListType);

            if(this.sectionList == null){
                return new ArrayList<>();
            }
        }catch (JsonSyntaxException ex){

            return new ArrayList<>();

        }catch (JsonParseException exc){

            return new ArrayList<>();
        }
    }
    return this.sectionList;
}

Für mich geht das.


1

Meine Utensilienklasse zum Speichern der Liste an SharedPreferences

public class SharedPrefApi {
    private SharedPreferences sharedPreferences;
    private Gson gson;

    public SharedPrefApi(Context context, Gson gson) {
        this.sharedPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        this.gson = gson;
    } 

    ...

    public <T> void putList(String key, List<T> list) {
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString(key, gson.toJson(list));
        editor.apply();
    }

    public <T> List<T> getList(String key, Class<T> clazz) {
        Type typeOfT = TypeToken.getParameterized(List.class, clazz).getType();
        return gson.fromJson(getString(key, null), typeOfT);
    }
}

Verwenden von

// for save
sharedPrefApi.putList(SharedPrefApi.Key.USER_LIST, userList);

// for retrieve
List<User> userList = sharedPrefApi.getList(SharedPrefApi.Key.USER_LIST, User.class);

.
Vollständiger Code meiner Utils // Überprüfen Sie anhand eines Beispiels im Aktivitätscode


1

Ich habe die gleiche Methode zum Speichern und Abrufen eines Strings verwendet, aber hier mit arrayList habe ich HashSet als Vermittler verwendet

Um arrayList in SharedPreferences zu speichern, verwenden wir HashSet:

1- Wir erstellen die Variable SharedPreferences (an der Stelle, an der die Änderung am Array erfolgt).

2 - Wir konvertieren die ArrayList in HashSet

3 - dann setzen wir das stringSet und wenden es an

4 - Sie erhalten getStringSet in HashSet und erstellen ArrayList neu, um das HashSet festzulegen.

public class MainActivity extends AppCompatActivity {
    ArrayList<String> arrayList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        SharedPreferences prefs = this.getSharedPreferences("com.example.nec.myapplication", Context.MODE_PRIVATE);

        HashSet<String> set = new HashSet(arrayList);
        prefs.edit().putStringSet("names", set).apply();


        set = (HashSet<String>) prefs.getStringSet("names", null);
        arrayList = new ArrayList(set);

        Log.i("array list", arrayList.toString());
    }
}

0
    public  void saveUserName(Context con,String username)
    {
        try
        {
            usernameSharedPreferences= PreferenceManager.getDefaultSharedPreferences(con);
            usernameEditor = usernameSharedPreferences.edit();
            usernameEditor.putInt(PREFS_KEY_SIZE,(USERNAME.size()+1)); 
            int size=USERNAME.size();//USERNAME is arrayList
            usernameEditor.putString(PREFS_KEY_USERNAME+size,username);
            usernameEditor.commit();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

    }
    public void loadUserName(Context con)
    {  
        try
        {
            usernameSharedPreferences= PreferenceManager.getDefaultSharedPreferences(con);
            size=usernameSharedPreferences.getInt(PREFS_KEY_SIZE,size);
            USERNAME.clear();
            for(int i=0;i<size;i++)
            { 
                String username1="";
                username1=usernameSharedPreferences.getString(PREFS_KEY_USERNAME+i,username1);
                USERNAME.add(username1);
            }
            usernameArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, USERNAME);
            username.setAdapter(usernameArrayAdapter);
            username.setThreshold(0);

        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

0

Alle obigen Antworten sind richtig. :) Ich selbst habe eines davon für meine Situation verwendet. Als ich jedoch die Frage las, stellte ich fest, dass das OP tatsächlich über ein anderes Szenario als den Titel dieses Beitrags spricht, wenn ich es nicht falsch verstanden habe.

"Ich brauche das Array, um zu bleiben, auch wenn der Benutzer die Aktivität verlässt und dann zu einem späteren Zeitpunkt wiederkommen möchte."

Er möchte tatsächlich, dass die Daten gespeichert werden, bis die App geöffnet ist, unabhängig davon, ob der Benutzer die Bildschirme innerhalb der Anwendung ändert.

"Ich brauche das Array jedoch nicht, nachdem die Anwendung vollständig geschlossen wurde."

Aber sobald die Anwendung geschlossen ist, sollten die Daten nicht mehr aufbewahrt werden SharedPreferences ist die nicht der optimale Weg dafür.

Für diese Anforderung kann eine Klasse erstellt werden, die die ApplicationKlasse erweitert.

public class MyApp extends Application {

    //Pardon me for using global ;)

    private ArrayList<CustomObject> globalArray;

    public void setGlobalArrayOfCustomObjects(ArrayList<CustomObject> newArray){
        globalArray = newArray; 
    }

    public ArrayList<CustomObject> getGlobalArrayOfCustomObjects(){
        return globalArray;
    }

}

Mit dem Setter und Getter kann von überall mit der Anwendung auf die ArrayList zugegriffen werden. Und das Beste daran ist, dass wir uns nach dem Schließen der App keine Sorgen mehr über die gespeicherten Daten machen müssen. :) :)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.