Android ArrayListe der benutzerdefinierten Objekte - In SharedPreferences speichern - Serialisierbar?


78

Ich habe eine ArrayList eines Objekts. Das Objekt enthält die Typen 'Bitmap' und 'String' und dann nur Getter und Setter für beide. Ist Bitmap zunächst serialisierbar?

Wie würde ich dies serialisieren, um es in SharedPreferences zu speichern? Ich habe viele Leute gesehen, die eine ähnliche Frage gestellt haben, aber keine scheint eine gute Antwort zu geben. Ich würde einige Codebeispiele bevorzugen, wenn dies überhaupt möglich ist.

Wenn die Bitmap nicht serialisierbar ist, wie gehe ich dann vor, um diese ArrayList zu speichern?

Danke vielmals.


Der Nachteil von SharedPreferences ist, dass Sie keine Objekte darin speichern können, so dass es nicht möglich ist, Objekte zu speichern :(
Abhinav Singh Maurya

Um es zu serialisieren, können Sie diese Antwort verwenden . Ich weiß jedoch nicht, wie das hilft SharedPreferences, da Sie dort nicht einfach serialisierte Objekte speichern können. Vielleicht denkst du an eine Bundle?
Geobits

1
ja du kannst sparen Überprüfen Sie meine Antwort.
Mohammad Imran

Antworten:


148

Ja, Sie können Ihr zusammengesetztes Objekt in freigegebenen Einstellungen speichern. Sagen wir..

 Student mStudentObject = new Student();
 SharedPreferences appSharedPrefs = PreferenceManager
             .getDefaultSharedPreferences(this.getApplicationContext());
 Editor prefsEditor = appSharedPrefs.edit();
 Gson gson = new Gson();
 String json = gson.toJson(mStudentObject);
 prefsEditor.putString("MyObject", json);
 prefsEditor.commit(); 

..und jetzt können Sie Ihr Objekt abrufen als:

 SharedPreferences appSharedPrefs = PreferenceManager
             .getDefaultSharedPreferences(this.getApplicationContext());
 Gson gson = new Gson();
 String json = appSharedPrefs.getString("MyObject", "");
 Student mStudentObject = gson.fromJson(json, Student.class);

Weitere Informationen finden Sie hier.

Wenn Sie ein ArrayListObjekt eines beliebigen Typs zurückerhalten möchten, z Student.

Type type = new TypeToken<List<Student>>(){}.getType();
List<Student> students = gson.fromJson(json, type);

Wie füge ich den JSON-Array-Namen ein, wenn ich ihn in den Einstellungen speichere?
Noman

Was hast du gemeint? Bitte erläutern Sie Ihre Frage.
Mohammad Imran

Dieser Code funktioniert nicht, wenn Sie eine ARRAYLIST
Bhavik Mehta

12
@ Bhavik Metha, Der oben geschriebene Code ist nicht für Arraylisten, der obige Code ist nur ein Beispiel. Wenn Sie eine Array-Liste vom Typ eines beliebigen Objekt-Ed-Schülers zurückerhalten möchten, verwenden Sie Folgendes: Type type = new TypeToken <List <Student>> () {}. GetType (); List <Student> students = gson.fromJson (json, type);
Mohammad Imran

1
Großartige Idee. Genial. Vielen Dank.
VipPunkJoshers Droopy

121

Die obige Antwort funktioniert, aber nicht für die Liste:

Um die Liste der Objekte zu speichern, gehen Sie wie folgt vor:

List<Cars> cars= new ArrayList<Cars>();
    cars.add(a);
    cars.add(b);
    cars.add(c);
    cars.add(d);

    gson = new Gson();
    String jsonCars = gson.toJson(cars);
    Log.d("TAG","jsonCars = " + jsonCars);

Lesen Sie das json-Objekt:

Type type = new TypeToken<List<Cars>>(){}.getType();
List<Cars> carsList = gson.fromJson(jsonCars, type);

3
Was ist das Paket von Typehier?
Shajeel Afzal

9
import java.lang.reflect.Type;
SpyZip

Was ist, wenn ich Platzhalter verwende Type type = new TypeToken<List<?>>(){}.getType(); ? Als Ergebnis erhalte ich eine LinkedTreeMap und dies ist die Definition meiner Methode: public static List<?> getList(String json) {
f.trajkovski

23

Bei mir hat es so funktioniert:

Werte in SharedPreferances einfügen:

String key = "Key";
ArrayList<ModelClass> ModelArrayList=new ArrayList();

SharedPreferences shref;
SharedPreferences.Editor editor;
shref = context.getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);

Gson gson = new Gson();
String json = gson.toJson(ModelArrayList);

editor = shref.edit();
editor.remove(key).commit();
editor.putString(key, json);
editor.commit();

So erhalten Sie Werte von SharedPreferances:

Gson gson = new Gson();
String response=shref.getString(key , "");
ArrayList<ModelClass> lstArrayList = gson.fromJson(response, 
    new TypeToken<List<ModelClass>>(){}.getType());

15

Zum Speichern:

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

Zum Laden:

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

PhoneCallLog ist der Name meines benutzerdefinierten Objekts. (Enthält String-, Long- und Boolesche Werte)


1
Sollten wir nicht applystatt verwenden commit?
Driftking9987

Wo müssen wir diese Methodenaufrufe platzieren?
Lucas Sousa

2

Das obige Beispiel von Mete wirkte wie ein Zauber.
Hier ist ein Kotlin- Beispiel

private var prefs: SharedPreferences = context?.getSharedPreferences("sharedPrefs", MODE_PRIVATE)
    ?: error("err")
private val gson = Gson()

sparen

fun saveObjectToArrayList(yourObject: YourObject) {
    val bookmarks = fetchArrayList()
    bookmarks.add(0, yourObject)
    val prefsEditor = prefs.edit()

    val json = gson.toJson(bookmarks)
    prefsEditor.putString("your_key", json)
    prefsEditor.apply()
}

lesen

fun fetchArrayList(): ArrayList<YourObject> {
    val yourArrayList: ArrayList<YourObject>
    val json = prefs.getString("your_key", "")

    yourArrayList = when {
        json.isNullOrEmpty() -> ArrayList()
        else -> gson.fromJson(json, object : TypeToken<List<Feed>>() {}.type)
    }

    return yourArrayList
}

1

Die Kotlin-Implementierung mit der GsonErweiterung der Antwort von @ SpyZips,

Serialisierung zu JSON

val jsonCars: String = Gson().toJson(cars);

Deserialisieren, um zur Liste der Objekte zurückzukehren

val type = object: TypeToken<List<Car>>(){}.type
val carsList: List<Car> = Gson().fromJson(jsonCars, type)
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.