# Persistente Speicherung



## xx (24. Aug 2011)

Hallo Leute,

wir haben ein Problem, und zwar programmieren wir im Rahmen einer Uni-Veranstaltung "Wer wird Millionär?". Jetzt sind wir gerade dabei, eine Liste zu erstellen, wo alle Gewinner abgespeichert werden. Uns wurde gesagt, dass wir die Eingabe der Nicknamen persistent abspeichern müssen, damit sie beim erneuten Öffnen des Programms wieder auftauchen. Könnt ihr uns helfen? Wir wissen nicht, wie wir vorgehen sollen 

Vielen Dank schon mal


----------



## Final_Striker (24. Aug 2011)

Entweder ihr schreibt die Daten in eine Datei oder ihr nutzt eine Datenbank.


----------



## Tomate_Salat (24. Aug 2011)

Ich würde eine Datenbank (H2 Database) nehmen. Dort würde ich auch die Fragen+Antworten hinterlegen.


----------



## xx (24. Aug 2011)

Wie geht man denn da vor? Bisher kann man seinen Namen in ein JTextfield schreiben...


----------



## xx (24. Aug 2011)

die Fragen und Antworten funktionieren schon....

Was ist eine H2 Database? Sorry, wir sind leider ziemliche Anfänger :/


----------



## Tomate_Salat (24. Aug 2011)

Galileo Computing :: Java ist auch eine Insel – 24.5 Mit Java an eine Datenbank andocken

Da findest du Informationen, wie man mit Datenbanken in Java arbeitet.

H2 Database ist ein Datenbanksystem (glaub relational) welches man embedded verwenden kann. Heißt: Die Datenbank wird ins Programm integriert und du kannst sie mit dem Programm ausliefern. (Erspart dir das installieren einer extra Datenbank)


----------



## Final_Striker (24. Aug 2011)

xx hat gesagt.:


> Wie geht man denn da vor? Bisher kann man seinen Namen in ein JTextfield schreiben...



Am besten ist wenn ihr zwei Buttons macht (Speichern, Laden), mit einem werden die Daten in die Datei geschrieben und beim zweiten aus der Datei gelesen.

Beispiele wie man in Dateien schriebt und wieder rausliest gib es min 1 Mil. bei Google.


----------



## chalkbag (24. Aug 2011)

Neuer Vorschlag, Serialisierung. Für die Anfänge vielleicht etwas leichter.

Java ist auch eine Insel – 12.14 Persistente Objekte und Serialisierung


----------



## bygones (25. Aug 2011)

bei dem anscheinigen wissenstand wuerde ich auch fuer serialisierung/datei schreiben-lesen tendieren.


----------



## xx (25. Aug 2011)

Das ist unsere Serialize Klasse:


```
package wird_wer_millionaer;

public class Abspeichern
{
	static void serialize(Vector spieler)
	{
		try
		{
			FileOutputStream file = new FileOutputStream("Millionaere.ser");
			ObjectOutputStream o = new ObjectOutputStream(file);
			o.writeObject(spieler);
			o.close();
		}
		catch( IOException e) 
		{
			System.err.println(e);
		}
		}
	
	static void deserialize(Vector spieler)
	{
		try
		{
		FileInputStream file = new FileInputStream("Millionaere.ser");
		ObjectInputStream input = new ObjectInputStream (file);
		spieler = (Vector) input.readObject();
		}
		catch (IOException e)
		{
			System.out.println(e);
		} 
		catch (ClassNotFoundException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
```


Wir haben einen Vektor erzeugt:

```
Vector spieler= new Vector ();

//in einer Methode dann:
Spieler mio= new Spieler(); //Spieler ist unsere Klasse mit Attributen Name und Verwendungszweck und sowie getter und setter

mio.setName(nickname.getText()); // nickname= JTextfield für Name
mio.setVervendungszweck(verwendung.getText()); // verwendung= JTextfield für verwendungszweck
spieler.add(mio);
```

Danach haben wir die Methoden serialize und deserialize aufgerufen.

Es erscheint eine io.notSerializableEsception.
Die abgespeicherten Daten des Vektor sollen auf einem Label erscheinen.
Könnt ihr uns helfen, wie wir das jetzt hinbekommen?


----------



## SlaterB (25. Aug 2011)

wie Java-Tags zu verwenden sind steht überall in roter Schrift, nicht das / vergessen

------

wo hast du den Code zum Speichern und Lesen her, welche Tutorials hast du gelesen, 
irgendein Beispiel-Objekt einer eigenen Klasse (nicht nur String, Vector & Co) schon erfolgreich gespeichert?

deine zu speichernden Klasse müssen das Interface Serializable implementieren,
das ist mit das einzige was zu tun ist, schon schwer zu übersehen..


----------



## xx (25. Aug 2011)

SlaterB hat gesagt.:


> deine zu speichernden Klasse müssen das Interface Serializable implementieren,
> das ist mit das einzige was zu tun ist, schon schwer zu übersehen..



funktioniert trotzdem nicht  gibt es noch was , das wir übersehen haben?


----------



## SlaterB (25. Aug 2011)

wenn weitere Klassen beteiligt sind, müssen die auch serialisiert werden,
üblicherweise steht in der vollständigen Fehlermeldung auch der exakte Klassenname..

wenn alles nichts hilft immer kompletten Code posten


----------



## bERt0r (25. Aug 2011)

Ums nochmal klar zu sagen: deine Klasse Spieler muss das Interface Serializable implementieren


----------



## freez (27. Aug 2011)

bygones hat gesagt.:


> bei dem anscheinigen wissenstand wuerde ich auch fuer serialisierung/datei schreiben-lesen tendieren.


Für den Lerneffekt würde ich auch den Vorschlag machen.

Ich persönlich würde die handvoll Millionäre in ein XML File via XStream packen (ungetestet):

```
XStream stream = new XStream();
ObjectOutputStream out = stream.createObjectOutputStream(new FileWriter("c:\\test.xml"));
out.writeObject(einMillionaer);
out.close();
```

Sollten es viele Millionäre werden, würde sich hier auch DB4o anbieten (auch ungetestet):

```
// accessDb4o
ObjectContainer db = Db4oEmbedded.openFile(Db4oEmbedded.newConfiguration(), "c:\\test.db4o");
try {
    db.store(einMillionaer);
} finally {
    db.close();
}
```


----------

