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?

ryandlf
quelle
Die Antwort finden Sie hier: stackoverflow.com/questions/14981233/…
Apurva Kolapkar
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

der Böse
quelle
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

kc ochibili
quelle
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));
    }

}
Harneet Kaur
quelle
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.

MByD
quelle
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();
Ayman Al-Absi
quelle
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 ...

Sachin Pangare
quelle
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)
}
Raviraj
quelle
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());
Avi Levin
quelle
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);
}
Krishna Vyas
quelle
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 !!! :) :)

SKT
quelle
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

Abdullah Khan
quelle
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.

Khemraj
quelle
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() }) 
}
Andrey Tuzov
quelle
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.

Winston
quelle
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'

Paras Santoki
quelle
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);
    }
}
Smaragdhieu
quelle
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.

Carlos Silva
quelle
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());
Anshul Bansal
quelle
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();
tmr
quelle
2
//Set the values
intent.putParcelableArrayListExtra("key",collection);

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

Vergessen Sie nicht, Serializable zu implementieren:

Class dataBean implements Serializable{
 public String name;
}
ArrayList<dataBean> dataBeanArrayList = new ArrayList();

https://stackoverflow.com/a/7635154/4639974

Manuel Schmitzberger
quelle
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;
Farhan
quelle
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;
    }
Anil Singhania
quelle
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.

Phil
quelle
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));
Yuliia Ashomok
quelle
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.

Ruben Caster
quelle
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

Phan Van Linh
quelle
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());
    }
}
NEC
quelle
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();
        }
    }
user4680583
quelle
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. :) :)

Atul O Holic
quelle