2009-11-06 15 views
8

Estoy escribiendo un programa que consultará una base de datos MS access, devolverá la consulta como un conjunto de resultados, y luego quiero convertir finalmente ese conjunto de resultados en una matriz String, para poder pasar en el constructor de un Swing JComboBox - por lo que el ComboBox enumerará los elementos devueltos por la consulta.Convertir el conjunto de resultados de Java a String array

He podido almacenar las filas del conjunto de resultados en una ArrayList, y luego convertir esa ArrayList en una matriz de objetos, y el cuadro combinado mostrará una lista de los elementos correctos, pero como objetos. Simplemente no puedo lanzar esa ArrayList a una matriz String. ¿Alguien sabe si esto es posible? Aquí está un poco de mi código ...

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

¿Alguien puede ofrecer alguna sugerencia? ¡Gracias!


ACTUALIZACIÓN:

Aquí es el seguimiento de la pila que estoy recibiendo:

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) 

Respuesta

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

es la respuesta correcta. El motivo de su excepción es que, en realidad, todos los objetos no son cadenas.

necesita cambiar esto:

Object value = rs.getObject(i); 

a esto:

String value = rs.getString(i); 

o esto:

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

Esto último tendrá un cheque nulo si se le puede devolver columnas nulas.

Tenga en cuenta que la representación de toString() puede no ser exactamente lo que está buscando en todos los casos, pero le permitirá comenzar.

Editar: Si está completando un cuadro combinado, va a necesitar una columna por fila, ¿no? Si no es así, debe representar toda la fila como una cadena de alguna manera.Luego pones eso en el valor y poner el valor directamente en la lista de arreglo final, por lo que el bucle tiene que tener este aspecto:

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

Gracias por su ayuda. Probé con lo que sugeriste, y todavía parece obtener esas excepciones en String [] arrLocations = locations.toArray (new String [0]); – littleK

+0

Ahora, si no te importa, comparte el seguimiento de la pila. –

+0

Agregué el seguimiento de pila a la publicación original, gracias. – littleK

3

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

El código anterior convertirá lista de cadenas de tipo Alfa. Ahora, en su caso, está creando Lista de Objetos, por lo que no puede convertirlo directamente a la matriz de Cadenas. En general, usted tiene 2 opciones:

  1. determinar primero su lista como lista de cadenas y al rellenar la Lista de convertir sus valores en Strings (éter haciendo Objeto # toString o extracción/generación de valor de cadena meningful) y la tienda que en su Lista, por ejemplo en su código haga esto String value = rs.getObject(i).toString();
  2. Si no lo hace en el paso 1, tendrá que asignar una matriz de cadenas, recorrer su lista, convertir el valor actual en cadena y pegarlo en una matriz. Me gustaría ir con la opción 1.

Así como una nota al margen - métodos en Java deben comenzar con letra minúscula

+0

lo he intentado antes, y me estaba dando una: Java.Lang.ArraystoreException \t en java.lang.System.arraycopy (Nativo Método) \t en java.util.Arrays.copyOf (origen desconocido) \t en java.util.ArrayList.toArray (origen desconocido) \t en kidsfirstdb.Main.main (Main.java:23) – littleK

+1

Ver mi mensaje extendido – Bostone

+0

Buena DroidIn trabajo. Pero el hecho es que la lista devuelta es una lista de listas. Incluso si usamos toString() o rs.getString(). No funcionaría para la Lista devuelta por el método. –

5

Por qué no usar rs.getString(). No recomendaré hacer eso sin embargo. Pero resolvería tu problema. Me refiero a tratar con String desde el principio. Ejemplo,

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

Ahora tiene que conseguirlo como a continuación.

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

Mejor aún compruebe el tipo y obtenga los valores de forma adecuada, utilizando metadatos que tenga. Esto te ayudará a formatear datos, es decir, fechas y dobles.