ArrayList <Object> in Shared Preferences speichern

  • 5 Antworten
  • Neuester Beitrag
Diskutiere ArrayList <Object> in Shared Preferences speichern im Android App Entwicklung im Bereich Betriebssysteme & Apps.
A

Andrez

Fortgeschrittenes Mitglied
Gibt es eine Möglichkeit eine Liste von Objekten in Shared Preferences zu speichern oder muss man dazu eine eigene Datenbank erstellen ?? Danke
 
reneph

reneph

Experte
Hm Stichwort Serialisierung könnte ggf. helfen.
 
A

Andrez

Fortgeschrittenes Mitglied
hab schon Parcelable implementiert um die Liste in onSaveInstantState zu speichern aber bei SharedPreferences gibt es kein putParcelableArrayList() - Methode...:(
 
A

amfa

Experte
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
 
A

Andrez

Fortgeschrittenes Mitglied
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();
 
A

amfa

Experte
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 - ArrayList <Object> in Shared Preferences speichern Antworten Datum
1