2009-11-06 6 views
8

J'écris un programme qui va interroger une base de données d'accès MS, retourner la requête en tant qu'ensemble de résultats, puis je veux finalement convertir ce jeu de résultats en un tableau String, afin que je puisse passer dans le constructeur d'un JComboBox Swing - de sorte que le ComboBox listera les éléments renvoyés par la requête.Convertir le jeu de résultats Java en tableau de chaînes

J'ai été capable de stocker les lignes du jeu de résultats dans une ArrayList, puis de convertir cette ArrayList en un tableau d'objets, et la liste déroulante liste les éléments corrects, mais en tant qu'objets. Je ne peux simplement jamais lancer cette ArrayList dans un tableau String. Est-ce que quelqu'un sait si c'est possible? Voici une partie de mon 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); 

Quelqu'un peut-il offrir des suggestions? Merci!


MISE À JOUR:

Voici la trace de la pile que je reçois:

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) 

Répondre

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

est la bonne réponse. La raison de votre exception est que tous les objets ne sont en fait pas des chaînes.

Vous devez changer ceci:

Object value = rs.getObject(i); 

à ceci:

String value = rs.getString(i); 

ou ceci:

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

Ce dernier aura besoin d'un chèque nul si vous retournerez colonnes nulles. Notez que la représentation toString() peut ne pas être exactement ce que vous recherchez dans tous les cas, mais elle vous aidera à démarrer. Editer: Si vous remplissez une zone de liste déroulante, vous aurez besoin d'une colonne par ligne, non? Sinon, vous devez représenter la ligne entière comme une chaîne d'une certaine manière.Ensuite, vous mettez que la valeur et de mettre la valeur directement dans la liste de tableau finale, de sorte que votre boucle doit ressembler à ceci:

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

Merci pour votre aide. J'ai essayé ce que vous avez suggéré, et je semble toujours obtenir ces exceptions sur String [] arrLocations = locations.toArray (new String [0]); – littleK

+0

Maintenant, si cela ne vous dérange pas, s'il vous plaît partager la trace de la pile. –

+0

J'ai ajouté la trace de la pile au message original, merci. – littleK

3

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

Le code ci-dessus convertir liste de chaînes à un tableau String. Dans votre cas, vous créez une liste d'objets, vous ne pouvez donc pas la convertir directement en tableau de chaînes. En général, vous avez 2 choix:

  1. commencer par définir votre liste comme une liste de chaînes et lors du remplissage de la liste convertir vos valeurs à cordes (éther en faisant l'objet # toString ou extraction/création de valeur de chaîne meningful) et stocker que dans votre Liste, par exemple Si vous ne le faites pas à l'étape 1, vous devrez allouer un tableau de chaînes, faire une boucle dans votre liste, convertir la valeur courante en chaîne et la coller dans le tableau. Je vais avec l'option 1.

Tout comme une note de côté - les méthodes Java doivent commencer par lettre minuscule

+0

J'ai essayé avant, et il me donnait: Java.Lang.ArraystoreException \t à java.lang.System.arraycopy (Native Method) \t à java.util.Arrays.copyOf (Source inconnue) \t à java.util.ArrayList.toArray (Source inconnue) \t à kidsfirstdb.Main.main (Main.java:23) – littleK

+1

Voir mon post étendu – Bostone

+0

bon travail DroidIn. Mais le fait est que la liste retournée est une liste de liste. Même si nous utilisons toString() ou rs.getString(). Cela ne fonctionnerait pas pour la liste retournée par la méthode. –

5

Pourquoi ne pas utiliser rs.getString(). Je ne recommanderai pas de le faire cependant. Mais cela résoudrait votre problème. Je veux juste parler de String depuis le début. Exemple,

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

Maintenant, vous devez l'obtenir comme ci-dessous.

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

Mieux encore vérifier le type et obtenir les valeurs de manière appropriée, en utilisant les métadonnées que vous avez. Cela vous aidera à mettre en forme les données, à savoir les dates et les doubles.

Questions connexes