ArrayList <Object> in Shared Preferences speichern

A

Andrez

Fortgeschrittenes Mitglied
64
Gibt es eine Möglichkeit eine Liste von Objekten in Shared Preferences zu speichern oder muss man dazu eine eigene Datenbank erstellen ?? Danke
 
Hm Stichwort Serialisierung könnte ggf. helfen.
 
hab schon Parcelable implementiert um die Liste in onSaveInstantState zu speichern aber bei SharedPreferences gibt es kein putParcelableArrayList() - Methode...:(
 
Parcable bringt dir in dem Fall nicht viel, dass stimmt.
Sehr einfach würde das mit Gson gehen.
Dann könntest du aus deiner Liste ein Json Objekt machen (also einen String) und diesen in den Preferences speichern.

https://code.google.com/p/google-gson/

Wobei das darauf ankommt was für Objekte du in der Liste hast, wenn das ganz verschiedene sind wird das schwierig bis unmöglich das wirklich sinnvoll zu serialisieren.
Bzw das deserialisieren wird schwierig, da du dann nicht entscheiden kannst, was welches Objekt für ein Typ ist.
Je Simpler die Objekte die du speichern willst sind, desto einfacher wird das ganze natürlich.

Wenn es ganz simple Objekte sind die z.b. 1 String und 1 Zahl beinhalten könntest du auch sehr simple eine eigene Speicherlogik bauen.
Du speicherst einfach für jedes Objekt in der Liste 2 Einträge in den SharedPreferences.
putString("Liste.Objekt1.stringbezeichnung", objekt1.getStringbezeichnung())
putInt("Liste.Objekt1.zahl", objekt1.getInt())

das gleiche für Objekt 2,3,4.... usw.

Zum wieder herstellen speicherst du dir noch die Anzahl der Objekte.
Baust eine neue Liste und fügst neue Objekte mit den jeweiligen Werten wieder hinzu.

Du hast dann in der Liste allerdings nicht die selben objekte, sondern neue mit den gleichen Werten ( altesObjekt == neuesObjekt sollte false liefern, aber altesObjekt.equals(neuesObjekt) true, wenn equals richtig implementiert ist für das Objekt.

Theoretisch könnte man so sogar sehr sehr komplexe Objekte speichern.
Denn am Ende wird es immer Objekte geben die nur aus Strings und Zahlen bestehen ;)
Allerdings wird der Aufwand natürlich umsogrößer
 
Mit Gson habe ich schon mal versucht aber da ist die App ständig abgestürzt :( implementiert habe ich die Bibliotheken immer richtig. MIt dem Serialisieren hat es im einfachen Java Programm super gelaufen und wie man auf Android Dateien speichert habe ich auch herausgefunden.
Die Objekte bestehen aus mehreren Strings, doubles, ints, ViewGroup und Context. Leider will Android diese Liste nicht speichern...liegt es am Context und an der ViewGroup dann kann ich ohne diese es versuchen.

Der ursprüngliche Beitrag von 09:12 Uhr wurde um 09:27 Uhr ergänzt:

Code:
public void onSaveInFile( ArrayList <ListValue> arrayList )
			{
				FileOutputStream outputStream;
				ObjectOutputStream objectOutputStream;

				try
					{
						outputStream = openFileOutput( FILENAME, Context.MODE_PRIVATE );
						objectOutputStream = new ObjectOutputStream( outputStream );
						objectOutputStream.writeObject( arrayList );
						objectOutputStream.close();
						outputStream.close();

					}
				catch ( Exception e )
					{
						Toast.makeText( context, "FAIL!", Toast.LENGTH_SHORT ).show();
						e.printStackTrace();
					}
			}
So sieht mein Speicher Code aus...wenn ich das erste Element speichere (also ich füge der Liste ein Objekt hinzu und speichere diese dann) klappt es wunderbar. Wenn ich jedoch jetzt der Liste ein weiteres Objekt hinzufüge kommt die Toast Message mit "FAIL!" :/

Der ursprüngliche Beitrag von 09:27 Uhr wurde um 09:33 Uhr ergänzt:

Code:
gespeicherteListValues.add( listValue ); // Liste die für SaveInstantState benutzt wird Context und ViewGroup sind null

								onSaveInFile( gespeicherteListValues );
								// Hier müsste es gespeichert werden
								listValue.setContext( context );
								listValue.setViewGroup( mGroup );
								listValue.addItem(); // Element wird der ViewGroup hinzugefügt
So sieht die Implementierung im Code aus

Der ursprüngliche Beitrag von 09:33 Uhr wurde um 09:56 Uhr ergänzt:

Hab es hinbekommen, sieht leider nicht so gut aus aber es funktioniert:

Code:
ListValue test = new ListValue();
								test.setOwnValue( ownValue );
								test.setValueCenti( valueCenti );
								test.setValueMasche( valueMaschen );
								test.setValueReihe( valueReihen );
								test.setVorgegebenerString( ausgewaehlteEinheit );
								tempList.add( test );
								if ( tempList.size() == 3 )
									{
										onSaveInFile( tempList );
										Toast.makeText( context, "YEAH!" + tempList.size(), Toast.LENGTH_SHORT ).show();
									}

								Toast.makeText( context, "Länge der Liste : " + tempList.size(), Toast.LENGTH_SHORT ).show();
 
Context und ViewGroups darfst du sowieso nicht mit wegspeichern.
Bzw dürfen schon, aber niemals solltest du die wieder verwenden.
Den Context solltest du halt gar nicht erst speichern, der wird ja bei jedem Appstart neu aufgebaut und nur den darfst und solltest du verwenden.
Ähnlich bei der Viewgroup.
Wenn du die wieder auslesen würdest, gibt es die Views da drin ja gar nicht mehr
 

Ähnliche Themen

B
Antworten
6
Aufrufe
1.049
jogimuc
J
T
Antworten
1
Aufrufe
850
jogimuc
J
A
Antworten
10
Aufrufe
1.902
swa00
swa00
Zurück
Oben Unten