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.

Paul Blundell
quelle
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);
Mohammad Imran
quelle
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);
SpyZip
quelle
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());
Apurva Kolapkar
quelle
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)

Mete
quelle
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
}
r3dm4n
quelle
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)
Alles ist gut
quelle