Frage

Ich schreibe ein Programm, das eine MS Access-Datenbank, geben Sie die Abfrage als Ergebnismenge abfragen, und dann will ich schließlich dieses Ergebnis umwandeln in eine String-Array festgelegt, so dass ich es in den Konstruktor eines passieren kann schwingen JComboBox -. so die ComboBox listet die Elemente von der Abfrage zurückgegeben

ich in der Lage gewesen, die Reihen des Ergebnisses in eine Arraylist gesetzt zu speichern und konvertiert dann die Arraylist in einen Objekt-Array und die Combobox werden die richtigen Elemente, sondern als Objekte aufzulisten. Ich kann einfach nicht immer, dass die Arraylist in ein String-Array gegossen. Weiß jemand, ob dies möglich ist? Hier sind einige von meinem Code ...

// 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 jemand irgendwelche Vorschläge anbieten? Dank!


UPDATE:

Hier ist der Stack-Trace, die 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)
War es hilfreich?

Lösung

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

Ist die richtige Antwort. Der Grund für die Ausnahme ist, dass alle Objekte sind in der Tat keine Strings.

Sie müssen dies ändern:

   Object value = rs.getObject(i);

folgt aus:

   String value = rs.getString(i);

oder folgt aus:

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

Die letzte wird eine NULL-Prüfung benötigen, wenn Sie null Spalten zurückkehren werden können.

Beachten Sie, dass die toString () Darstellung nicht genau sein kann, was Sie in allen Fällen suchen, aber es wird Ihnen den Start.

Edit: Wenn Sie ein Kombinationsfeld füllen, werden Sie eine Spalte pro Zeile müssen, nicht wahr? Wenn nicht, müssen Sie die ganze Zeile als String in irgendeiner Art und Weise repräsentieren. Dann legen Sie, dass in den Wert und den Wert setzen direkt in der letzten Array-Liste, so dass Ihre Schleife wie folgt aussehen muss:

    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;

Andere Tipps

Warum rs.getString nicht (). Ich will nicht, dass, obwohl zu tun empfehlen. Aber es wäre Ihr Problem zu lösen. Ich meine, beschäftigen nur mit String von Anfang an. 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]);

Bessere überprüfen noch die Art und die Werte in geeigneter Weise erhalten, Meta-Daten unter Verwendung Sie haben. Dies wird Ihnen Formatdaten, nämlich, Daten und Doppel helfen.

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

Der obige Code konvertiert Liste der Strings String-Array. Jetzt in Ihrem Fall, dass Sie Liste der Objekte erstellen, so dass Sie nicht direkt an das String-Array umwandeln können. Im Allgemeinen haben Sie 2 Möglichkeiten:

  1. Am Anfang Ihre Liste als Liste von Strings definieren und wenn die Liste bevölkert Ihre Werte Strings (Äther von Objekt # toString tun oder Extrahieren / meningful String-Wert zu erzeugen) umwandeln und speichern, die in Ihre Liste, z.B. im Code tun dies String value = rs.getObject(i).toString();
  2. Wenn Sie in Schritt nicht tun 1, dann werden Sie ein String-Array zuweisen müssen, Schleife durch die Liste, die aktuellen Wert in String konvertieren und es in einem Array bleiben. Ich würde mit Option 1.

Nur als Randnotiz - Methoden in Java sollte mit Kleinbuchstaben beginnen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top