ArrayList-Problem?

saudade

Grünschnabel
Zuerst die Codezeilen,

die problematische Methode sieht so aus:

Java:
public ArrayList<Book> buildTable(String sql)
{
	Book datensatz = new Book();
	ArrayList<Book> books = new ArrayList<Book>();
	String[] helper = new String[7];
	if (this.readDB(sql))
	{
		try 
		{
			result.beforeFirst();
			
			while(result.next())
			{
				for (int i= 0; i < 7; i++)
				{					
				  helper[i] = result.getString(i + 1);
				}
				datensatz.setDataset(helper);
				books.add(datensatz);		
			}
		} 
		catch (SQLException e)
		{
		  errortext = "Es ist ein Fehler aufgetreten. <br>" + e.getMessage();
		}
	}
		
	return books;
}

Das Problem ist, dass die ArrayList books am Ende 15 Mal (Anzahl der Datensätze in der DB) den zuletzt aus der Datenbank eingelesenen Datensatz enthält, die anderen fehlen. Die Pointe für mich besteht allerdings darin, dass während der while-Schleife alles zu funktionieren scheint, zu diesem Zeitpunkt sind sämtliche Datensätze korrekt in der ArrayList enthalten - hab's mit "System.out.println(books.size() + " " + j + " " + books.get(j).getDataset()[2].toString());" in der while-Schleife überprüft.

Was ist der Fehler, wie heißt er & wo wohnt er?
Danke im Voraus für Zweckdienliches
 
Zuletzt bearbeitet von einem Moderator:

zeja

Erfahrenes Mitglied
Du mußt schon in deiner while-Schleife jedes mal ein new Book machen, ansonsten manipulierst du immer wieder das selbe Objekt überschreibst also mit den zweiten Datensatz die des ersten und packst dann das selbe Objekt wieder in die Liste.

Eine Liste speichert ja immer nur die Referenzen auf die Objekte. Und wenn du immer wieder das selber Objekt verwendest steht halt immer das selbe drin.
 

saudade

Grünschnabel
Das klingt einleuchtend, ich hab's auch gemacht, aber das Problem bleibt.
Hm, hast du noch eine Idee?
 

Oliver Gierke

Erfahrenes Mitglied
Wie schaut denn der Code jetzt aus. Wenn du zejas Tipp richtig umgesetzt hast, sollte es tun.

Vielleicht noch ein kleiner Tipp: Arbeite soviel wie möglich mit Interfaces:

Code:
List<Book> books = new ArrayList<Book>();

bzw.

Code:
public List<Book> buildTable(String sql)

ist besser.

REINHAUN!
 

saudade

Grünschnabel
Danke für die tag-Spende...

Der Code sieht jetzt so aus:

Java:
public ArrayList<Book> buildTable(String sql)
	{
		Book datensatz;
		ArrayList<Book> books = new ArrayList<Book>();
		String[] helper = new String[7];
		if (this.readDB(sql))
		{
			try 
			{
				result.beforeFirst();
				while(result.next())
				{
					datensatz = new Book();
					for (int i= 0; i < 7; i++)
					{
						helper[i] = result.getString(i + 1);
					}
					datensatz.setDataset(helper);
					books.add(datensatz);
				}
			} 
			catch (SQLException e)
			{
				errortext = "Es ist ein Fehler aufgetreten. <br>" + e.getMessage();
			}
		}
	}

Meine Java-Bildung ist noch nicht sehr ausgeprägt, deshalb hab' ich das mit dem Interface nicht völlig verstanden, aber ich werde darüber meditieren...
 

zerix

Hausmeister
Moderator
Hallo,

also ich denke ja mal, dass das Problem noch besteht.
Ich habe es nicht getestet, aber das ist ja eigentlich klar. Es liegt an deinem String-Array. Ein Array ist ja auch ein Object. Du hast das gleiche String-Array in allen Books enthalten. Wenn du das Array dann änderst, änderst du dann natürlich die Daten in allen Books.

MFG

Sascha
 

saudade

Grünschnabel
Besten, größten,tiefsten, höchsten und herzlichsten Dank.
Jetzt geh' ich glücklich was trinken.

:) regards