2009-11-06 7 views
8

Sto scrivendo un programma che interrogherà un database di accesso MS, restituirà la query come un set di risultati, e poi voglio convertire quel set di risultati in un array String, così posso passare nel costruttore di uno Swing JComboBox - quindi il ComboBox elencherà gli elementi restituiti dalla query.Converti il ​​set di risultati Java in serie di stringhe

Sono stato in grado di memorizzare le righe del set di risultati in un ArrayList e quindi convertire tale ArrayList in un array di oggetti e la casella combinata elencherà gli elementi corretti, ma come oggetti. Non riesco semplicemente a trasmettere quell'ArrayList a un array String. Qualcuno sa se questo è possibile? Ecco alcuni dei miei codici ...

// 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); 

Qualcuno può offrire qualche suggerimento? Grazie!


UPDATE:

Ecco la traccia dello stack che sto ricevendo:

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) 

risposta

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

è la risposta corretta. Il motivo della tua eccezione è che tutti gli oggetti non sono effettivamente stringhe.

è necessario modificare questo:

Object value = rs.getObject(i); 

a questo:

String value = rs.getString(i); 

o questo:

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

Questo ultimo avrà bisogno di un controllo nullo se si può essere tornando colonne null.

Si noti che la rappresentazione toString() potrebbe non essere esattamente ciò che si sta cercando in tutti i casi, ma in questo modo si inizierà.

Modifica: se si sta compilando una casella combinata, sarà necessaria una colonna per riga, no? In caso contrario, è necessario rappresentare l'intera riga come una stringa in qualche modo.Poi si mette che nel valore e mettere il valore direttamente nella lista di array finale, in modo che il ciclo ha bisogno di guardare in questo modo:

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; 
+0

Grazie per il vostro aiuto. Ho provato quello che mi hai suggerito, e mi sembra di avere ancora queste eccezioni su String [] arrLocations = locations.toArray (new String [0]); – littleK

+0

Ora, se non ti dispiace, per favore condividi la traccia dello stack. –

+0

Ho aggiunto la traccia dello stack al post originale, grazie. – littleK

3

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

Il codice qui sopra convertire lista di stringhe di array di String. Ora nel tuo caso stai creando un elenco di oggetti in modo da non poterlo convertire direttamente nell'array String. In genere si hanno 2 scelte:

  1. Inizialmente definire la vostra lista come lista di stringhe e durante il popolamento del List convertire i vostri valori da stringhe (etere facendo Object # toString o l'estrazione/generazione di valore String meningful) e memorizzare che nella vostra Elenco, ad es nel codice fai questo String value = rs.getObject(i).toString();
  2. Se non lo fai al punto 1, dovrai allocare un array di stringhe, scorrere il tuo elenco, convertire il valore corrente in stringa e inserirlo in un array. Vorrei andare con l'opzione 1.

Proprio come una nota a margine - metodi in Java devono iniziare con la lettera minuscola

+0

ho provato prima, e mi stava dando un: java.lang.ArrayStoreException \t a java.lang.System.arraycopy (metodo natale) \t a java.util.Arrays.copyOf (fonte sconosciuta) \t a java.util.ArrayList.toArray (fonte sconosciuta) \t a kidsfirstdb.Main.main (Main.java:23) – littleK

+1

Vedi il mio posto esteso – Bostone

+0

Buon DroidIn lavoro. Ma il fatto è che la Lista restituita è una Lista di Lista. Anche se usiamo toString() o rs.getString(). Non funzionerebbe per l'elenco restituito dal metodo. –

5

Perché non usare rs.getString(). Non lo raccomanderò comunque. Ma risolverebbe il tuo problema. Voglio dire, tratti con String dall'inizio. Esempio,

// 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; 
} 

Ora è necessario farlo come di seguito.

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

Meglio ancora controllare il tipo e ottenere i valori in modo appropriato, utilizzando i meta-dati che si stanno avendo. Questo ti aiuterà a formattare i dati, vale a dire date e doppie.