Frage Konvertiere Java resultset in String array


Ich schreibe ein Programm, das eine MS-Access-Datenbank abfragt, die Abfrage als Ergebnismenge zurückgibt, und dann möchte ich diese Ergebnismenge schließlich in ein String-Array konvertieren, damit ich sie in den Konstruktor einer Swing-JComboBox übergeben kann - Die ComboBox listet also die von der Abfrage zurückgegebenen Elemente auf.

Ich konnte die Zeilen der Ergebnismenge in einer ArrayList speichern und diese ArrayList dann in ein Objektarray konvertieren, und die Combobox listet die richtigen Elemente auf, aber als Objekte. Ich kann diese ArrayList einfach niemals in ein String-Array umwandeln. Weiß jemand, ob das möglich ist? Hier ist ein Teil meines Codes ...

// Convert the Resultset into an array list

public ArrayList<ArrayList<Object>> Results2Array(ResultSet rs) throws SQLException {
    ResultSetMetaData metaData = rs.getMetaData();
    int columns = metaData.getColumnCount();

    ArrayList<ArrayList<Object>> al = new ArrayList<ArrayList<Object>>();

    while (rs.next()) {
        ArrayList<Object> record = new ArrayList<Object>();

        for (int i = 1; i <= columns; i++) {
            Object value = rs.getObject(i);
            record.add(value);
        }
        al.add(record);
    }
    return al;
}

// Convert ArrayList to Object Array, and pass into GUI

ArrayList<String> Locations = new ArrayList<String>();
ArrayList<String> Months = new ArrayList<String>();
ArrayList<String> Years = new ArrayList<String>();

try {
    DB.loadDriver();
    DB.makeConnection();
    DB.buildStatement();

    Locations = DB.getLocations();
    Months = DB.getMonths();
    Years = DB.getYears();

    Object[] arrLocations = Locations.toArray();
    Object[] arrMonths = Months.toArray();
    Object[] arrYears = Years.toArray();

    dbGUI ui = new dbGUI(arrLocations, arrMonths, arrYears);
    ui.setVisible(true);

Kann mir jemand Vorschläge machen? Vielen Dank!


AKTUALISIEREN:

Hier ist der Stack-Trace, den ich erhalte:

java.lang.ArrayStoreException
    at java.lang.System.arraycopy(Native Method)
    at java.util.Arrays.copyOf(Unknown Source)
    at java.util.ArrayList.toArray(Unknown Source)
    at kidsfirstdb.Main.main(Main.java:23)

8
2017-11-06 02:27


Ursprung


Antworten:


   String[] arrLocations = locations.toArray(new String[0]);

Ist die richtige Antwort. Der Grund für Ihre Ausnahme ist, dass alle Objekte tatsächlich keine Zeichenfolgen sind.

Sie müssen das ändern:

   Object value = rs.getObject(i);

zu diesem:

   String value = rs.getString(i);

oder dieses:

   String value = rs.getObject(i).toString();

Dieser letzte wird eine Nullprüfung benötigen, wenn Sie Null-Spalten zurückgeben können.

Beachten Sie, dass die toString () - Darstellung möglicherweise nicht in allen Fällen genau das ist, wonach Sie suchen, aber es wird Ihnen den Einstieg ermöglichen.

Bearbeiten: Wenn Sie ein Kombinationsfeld füllen, benötigen Sie eine Spalte pro Zeile, nein? Wenn nicht, müssen Sie die ganze Zeile als String darstellen. Dann fügen Sie das in den Wert ein und setzen den Wert direkt in die letzte Array-Liste. Ihre Schleife muss also so aussehen:

    ArrayList<String> al = new ArrayList<String>();
    while (rs.next()) {
            ArrayList<String> record = new ArrayList<String>();
            for (int i = 1; i <= columns; i++) {
                    String value = rs.String(i);
                    record.add(value);
            }
            String value = methodWhichConvertsArrayListToStringTheWayYouNeedItFormatted(record);
            al.add(value);
    }        
    return al;

5
2017-11-06 02:41



Warum nicht rs.getString () verwenden. Ich werde das aber nicht empfehlen. Aber es würde dein Problem lösen. Ich meine, wir müssen uns von Anfang an mit String auseinandersetzen. Beispiel,

// Not a good idea to pass a active resultset as a parameter. 
// Use disconnected implementation instead, for example rowset.
public ArrayList<ArrayList<Object>> results2Array(ResultSet rs)
            throws SQLException {
    ResultSetMetaData metaData = rs.getMetaData();
    int columns = metaData.getColumnCount();

    ArrayList<String[]> list = new ArrayList<String[]>();

    while (rs.next()) {
            String[] record = new String[columns];

            for (int i = 1; i <= columns; i++) {
                    // Not a good idea to get everything as a string. This way you will
                    // get a default string representation of objects. Suppose, you 
                    // want to format dates and doubles as per some requirement.
                    record[i-1] = rs.getString(i);
            }
            list.add(record);
    }
    return list;
}

Jetzt müssen Sie es wie unten erhalten.

String[][] arrLocations = locations.toArray(new String[locations.size()][0]);

Überprüfen Sie besser den Typ und erhalten Sie die Werte unter Verwendung von Metadaten, die Sie haben. Dies wird Ihnen helfen, Daten zu formatieren, nämlich Daten und Doppel.


5
2017-11-06 02:45



String[] arrLocations = locations.toArray(new String[0]);

Der obige Code konvertiert die String-Liste in ein String-Array. Jetzt erstellen Sie in Ihrem Fall eine Liste von Objekten, so dass Sie sie nicht direkt in das String-Array konvertieren können. Generell haben Sie 2 Möglichkeiten:

  1. Definieren Sie zunächst Ihre Liste als Liste der Strings und beim Auffüllen der Liste konvertieren Sie Ihre Werte in Strings (Äther, indem Sie Objekt # toString oder Extrahieren / Erzeugen meningful String-Wert) und speichern Sie das in Ihrer Liste, z. in deinem Code tue dies String value = rs.getObject(i).toString();
  2. Wenn Sie es nicht in Schritt 1 tun, müssen Sie ein String-Array zuweisen, durch Ihre Liste laufen, den aktuellen Wert in String umwandeln und ihn in ein Array stecken. Ich würde mit Option 1 gehen.

Nur als Randnotiz - Methoden in Java sollten mit Kleinbuchstaben beginnen


3
2017-11-06 02:33