Datenbank und Java

skipjip

Grünschnabel
Hallo,

ich schreibe gerade ein AdminTool das Daten aus einer Datenbank holt bisher funktioniert alles wunderbar. Nun gib ich die Einträge der DB in einer JLIST aus wenn ich einen Namen auswähl soll z.B. der Vorname in einem JTextField erscheint damit man die Einträge editieren und speichern kann. Hier mal der CODE.
Hoffe ihr könnt mir helfen das ich den Eintrag in dem JTextField ausgeben kann


Code:
import javax.swing.*;
import java.sql.*;
import java.awt.*;
import java.util.*;
import javax.swing.event.*;

public class AdminTool {

    private Connection connection;
    private Statement statement;
    private ResultSet rs;
    private JList userList;
    private ArrayList<String> arrayList;
    private JLabel label;
    private DefaultListModel dlm;
    private JTextField firstnameText, lastname, street, city, plz, mail_adress;

    public AdminTool() {
        try {
            Class.forName("org.sqlite.JDBC");
        } catch (Exception e) {
            System.err.println("Unable to find and load driver");
            System.exit(1);
        }
    }

    public void loadAccount() {
        arrayList = new ArrayList<String>();
        try {
            rs = statement.executeQuery("SELECT * FROM users;");
            while (rs.next()) {
                arrayList.add(rs.getString("firstname") + " " + rs.getString("lastname"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void buildGUI() {
        JFrame frame = new JFrame("");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel wPanel = new JPanel();
        JPanel cPanel = new JPanel();

        loadAccount();

        dlm = new DefaultListModel();
        userList = new JList(dlm);
        for (int i = 0; i < arrayList.size(); i++) {
            dlm.addElement(arrayList.get(i));
        }

        JScrollPane scroller = new JScrollPane(userList);
        scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

        userList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        userList.addListSelectionListener(new SharedListSelectionHandler());

        firstnameText = new JTextField(15);

        userList.setVisibleRowCount(18);
        wPanel.add(scroller);
        cPanel.add(firstnameText);
        frame.getContentPane().add(BorderLayout.WEST, wPanel);
        frame.getContentPane().add(BorderLayout.CENTER, cPanel);
        frame.setSize(600, 600);
        frame.setVisible(true);
    }

    class SharedListSelectionHandler implements ListSelectionListener {
        public void valueChanged(ListSelectionEvent lse) {
            if (!lse.getValueIsAdjusting()) {                           
                try {
                    while (rs.next()) {
                      firstnameText.setText(rs.getString("firstname"));
                    }
                } catch (SQLException ex) {
                   ex.printStackTrace();
               }
            }
        }
    }

    public void connectToDB() {
        try {
            connection = DriverManager.getConnection("jdbc:sqlite:/home/sklaiber/workspace/AdminTool/de/mybrief/AdminTool/mybrief_devel.db");
            statement = connection.createStatement();

        } catch (SQLException connectException) {
            System.out.println(connectException.getMessage());
            System.out.println(connectException.getSQLState());
            System.out.println(connectException.getErrorCode());
            System.exit(1);
        }
    }

    public static void main(String[] args) {
        AdminTool tool = new AdminTool();
        tool.connectToDB();
        tool.buildGUI();
    }
}

Danke im Voraus

MFG Skipjip
 
Hallo!
Ich würde die Sache mal folgendermaßen angehen.
Als allererstes brauchst du einen Primärschlüssel (id) in deiner Datenbank, aber das wirst du sicher haben.
Dann solltest du den Primärschlüssel auch einlesen. Ich habe das z.B. bei mir so bewerkstelligt, dass ich einen zweiten Array angelegt habe. In den einen schreibst du, so wie du es ja machst den Namen. In den anderen, am besten an der gleichen Stelle die id.

Dann machst du eine Liste mit den Namen. Auf diese Liste legst du entweder eine Action, die ausgeführt wird, wenn du einen Namen auswählst, oder du machst einen Button, der eine Aktion ausführt, und das gerade gewählte in die TextFields ladet.
(du kannst hier den Vorteil ausnutzen, dass du der Array 0-relativ ist (fängt bei 0 an) und die Liste auch. So weißt du dann auch, welche id du verwendest (Bsp: der vierte Namen in der Liste wird ausgewählt, das ist genau der vierte Eintrag in dem id-Array.

Und jetzt ein wichtiger Trick: Damit du weißt, was gerade editiert wird (also in dem TextField steht), machst du einfach noch ein zweites id-Textfield dazu (kann ja auch invisible sein) und da schreibst gleich auch die id rein. Wenn du dann fertig bist mit dem Editieren, kannst einfach auf einen weiteren Button klicken "Speichern". Der führt dann die Aktionen aus:
- aktuelle id vom id-Textfield lesen
- Daten in die Datenbank schreiben (vom Namens-Textfield) also quasi: UPDATE tabellenname SET name=name ... WHERE id = id!
id und name kommen vom Textfield!

Viel Erfolg
vNeumann
 
ok hab eine neue ArrayList in der ich die ID speichere, aber ich weiß nicht genau was ich dann in den ListSelectionListener schreiben soll? Damit er mir den ausgewählten Eintrag von der JList in dem TextField ausgibt!
 
du kannst in dem listener einfach so etwas schreiben wie:

idTextfield.setText(idArray.get(jList.getSelectedIndex()));
dann schreibst du in das Textfield die id rein. die bekommst du über die jList.

So irgendwie müsste das gehen. Ich hab das bei einer comboBox gemacht. Hoffe mal, dass es bei der jList ähnlich funktioniert :)
 
danke soweit funktoniert das jetzt hab ich noch ne andere frage und zwar will ich den Vornamen und Nachnamen jeweils in einem eigenen Feld ausgeben! Speicher jetzt aber beide Einträge in einer ArrayList kann ich das irgenwie machen? Oder muss ich für den Nachnamen eine eigene ArrayList anlegen?
 
Da Vorname und Nachname zusammen gehören, legst du dir am besten eine eigene Klasse an, die diese beiden Daten aufnehmen kann und packst dann ein Objekt der Klasse mit den Daten in die Liste.
 
klar, die Variante von zeja mit der Klasse wäre sicherlich die schönere Lösung. Jedoch würde ich es - einfach wirklich in noch einen Array speichern. Würde nicht extra noch ne Klasse anlegen.
 
Beratungsresistenz? Ich sagte ja, die schönere Lösung ist sicherlich, wenn man dazu eine Klasse anlegt. Ist formal sicherlich eine saubere Lösung. z.B. eine Klasse User mit den Werten id, Nachname, Vorname zu bauen. Diese vielleicht noch mit einer Hashmap verwaltet...

Jedoch bin ich davon ausgegangen, dass er vielleicht eher ein Einsteiger ist, und eine einfache, leicht zu überschauende Lösung gerne hätte. Und da ist es, natürlich je nach Ansichtssache, eine leichter überschaubarere Lösung einfach die Daten in Arrays zu verwalten. Aber stimmt natürlich, ist keine schöne Lösung 3 Arrays (id, vorname und nachname) zu bauen - ist eben zweckmäßig. :)
 
Auch als Einsteiger sollte man lernen, die richtige Abstraktionsstufe zu finden. Und daher ist Zejas Vorschlag in meinen Augen der einzig richtige. IMHO bringt es nichts, Einsteiger künstlich klein zu halten und quasi auf Händen und Knien mit rudimentärsten Datentypen kämpfen zu lassen und sich so das Leben unnötig schwer zu machen. Im Gegenteil - an diesem Beispiel zeigt sich recht schön und simpel wie das Bilden von Klassen Code vereinfacht und sprechender macht.

Oder andersrum gefragt? Wann würdest du denn sonst einem "Einsteiger" (definiert das mal bitte jemand? ;) empfehlen eine Klasse für ein Konstrukt anzulegen?

Gruß
Ollie
 
Zurück