# Problem mit Datenbankabfrage



## flea (10. Dez 2010)

Hallo zusammen.

Ich habe schon ein paar mal hier im Forum nachgelesen. Da ich im Moment aber einfach nicht mehr weiter komme mache ich hiermit meinen ersten Eintrag : )
Ich arbeite an einem großen Programm mit. Meine Programmierkenntnisse sind allerdings nicht so groß, weswegen ich Probleme habe.

Folgender Code ist bereits in der DBC.java Klasse angelegt:


```
public DirectSpeeches loadDirectSpeeches(Chapter chapter, int level)
	throws Exception {
		Message answer = connection.call(new Message(key, "loadDirectSpeeches",
				new Integer(chapter.getDB_ID()), level));
		DirectSpeeches dss = (DirectSpeeches) answer.getArguments()[0];
		dss.setChapter(key, chapter);
		return dss;
	}
```

Mit folgendem Code kann ich darauf erfolgreich zugreifen:


```
case DirectSpeech: 
			return (Vector<DirectSpeech>) dbc.loadDirectSpeeches(chapter,0).getVector();
```


Einen "analogen" Zugriff will ich auf folgende Speicherung der Datenbank erreichen:



```
public synchronized ArrayList<DialogFaces> loadFaces (Chapter chapter, int level)
	throws Exception {
		Message answer = connection.call(new Message(key, "loadFaces", new Integer(chapter.getDB_ID()), level));
		ArrayList<DialogFaces> faces = (ArrayList<DialogFaces>) answer.getArguments()[0];
		for (int i=0; i != faces.size(); ++i) {
			DialogFaces face = faces.get(i);
			face.setChapter(key, chapter);
		}
		return faces;
```

Wie aber greife ich nun darauf zu???
Das hier funktioniert schon mal nicht:


```
case Faces: 
			return (ArrayList<DialogFaces>) dbc.loadFaces(chapter,null, 0).getArray();
```

Wäre super wenn mir jemand weiterhelfen könnte! Hoffe ich habe mich verständlich ausgedrückt.

Greetz Hannes


----------



## gman (10. Dez 2010)

In Zeile 2 in deinem zweiten Codebeispiel sollte das "getArray" überflüssig sein, da die Methode "loadFaces" ja ArrayList
als Rückgabewert hat (noch besser wäre an der Stelle nur List).

[c]return (List<DialogFaces>) dbc.loadFaces(chapter,null, 0);[/c]


----------



## flea (10. Dez 2010)

Ok, vielen Dank schon mal 

Leider klappts noch immer nicht.

Hier noch mal der Code wie er jetzt aussieht (außerdem hatte ich einen Parameter zu viel bei loadFaces() ). Zudem dieses mal inkl. Kopf, ich glaube der passt auch nicht ganz:


```
public static Vector<? extends DB_Element> getAll(TopDownType type, DBC dbc, Chapter chapter)
			throws IllegalArgumentException, Exception{
			
		switch (type) {

			
		case DialogFaces: 
			return (List<DialogFaces>) dbc.loadFaces(chapter, 0);

...
```


----------



## gman (10. Dez 2010)

Ups, die getAll-Methode hat ja Vector als Rückgabewert. Da hilft dir die Änderung dich ich dir vorgeschlagen
habe natürlich nicht weiter weil du damit den falschen Typ zurück gibst (nämlich List).
Muste halt entweder loadFaces so umschreiben das ein Vector zurückkommt oder die gelieferte Liste in einen
Vector packen:


```
case DialogFaces:

List<DialogFaces> list = dbc.loadFaces(chapter, 0);
Vector<DialogFaces> returnVector = new Vector<DialogFaces>();
returnVector.addAll(list);

return returnVector;
```


----------



## flea (11. Dez 2010)

Vielen Dank! Endlich funktioniert es 

Allerdings erhalte ich in meinem Programm dann nicht das "wirkliche" Ergebnis, sondern eine Art Adressierung:

de.uni.iz.bung1.dbc.data.DialogFaces@fed587b

Die Zahlen-Nummerkombination hinter dem @ variiert. Habe das selbe an einer anderen Stelle des Programms auch, also dass anstatt des "wahren" Ergebnisses so eine Adressierung kommt. 
Was bedeutet das und wie oder wo kann ich das vermutlich lösen?


----------



## gman (11. Dez 2010)

Das ist die Standard-Ausgabe der "toString"-Methode der Klasse DialogFaces, wenn du sie nicht überschrieben hast.
Wahrscheinlich musst du entweder die Methode überschreiben oder dir das aus dem DialogFaces-Objekt raussuchen
was du anzeigen willst.


----------



## flea (20. Dez 2010)

Ok. Habe jetzt schon ein paar Sachen probiert, aber ich komme nicht weiter. Meine DialogFaces Klasse sieht so aus:


```
public class DialogFaces extends DB_Element implements Serializable, Cloneable, CommentOwner
{
	private static final long serialVersionUID = 6534136883025047L;
	private int iuIndex;
	private String description;
	private DialogSpeaker speakers;
	private Chapter chapter;
	
	public DialogFaces (DBC_Key key, int id, Chapter chapter, String description, DialogSpeaker speakers, int iuIndex) 
	{
		super(id);
		key.unlock();
		this.chapter = chapter;
		this.iuIndex = iuIndex;
		this.description = description;
		this.speakers = speakers;
	}
	
	public DialogFaces (Chapter chapter, int iuIndex, String description, DialogSpeaker speakers)
	{
		super(-1);
		this.chapter = chapter;
		this.iuIndex = iuIndex;
		this.description = description;
		this.speakers = speakers;
	}
		
	public void setIUIndex(int iuindex) {
		this.iuIndex = iuindex;
	}
	
	public Integer getIUIndex() {
		return iuIndex;
	}
	
	public void setDescription(String description) {
		this.description = description;
	}
	
	public String getDescription() {
		return this.description;
	}
	
	
	public void setSpeaker(DialogSpeaker speakers)
	{
		this.speakers = speakers;
	}
	
	public DialogSpeaker getSpeakers()
	{
		return speakers;
	}

	public int getClassCode() {
		return Comments.CLASS_CODE_DIALOG_Faces;
	}

	@Override
	public int getIndex() {
		return -1;
	}

	@Override
	public boolean remove() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public void setChapter(DBC_Key key, Chapter chapter) {
		key.unlock();
	    this.chapter = chapter;		
	}
}
```


Die Klasse beinhaltet ja keine "to-string" Methode, oder?
Mit dem Breakpoint sehe ich, dass eigentlich alle gewünschten Ergebnisse mit deiner Methode geholt werden, nur zum Schluss erhalte ich nach wie vor lediglich die Adressierung als Ausgabe. Hmm..


----------



## preachie (20. Dez 2010)

DialogFaces mag keine toString() Methode definiert haben, allerdings die "Mutter aller Klassen" java.lang.Object, von der alle Java Klassen erben, besitzt sie und demzufolge nach den Regeln der Vererbung auch sämtliche andere Klassen.

Von daher, wie gman bereits geschrieben hat, musst Du die toString() Methode lokal überschreiben und darin ausgeben, was auch immer Du ausgeben möchtest.


----------

