Преобразование Java resultset в строковый массив

Я пишу программу, которая будет запрашивать базу данных MS access, возвращать запрос в качестве результирующего набора, а затем я хочу в конечном итоге преобразовать этот результирующий набор в строковый массив, чтобы я мог передать его в конструктор Swing JComboBox - так что ComboBox будет перечислять элементы, возвращаемые запросом.

я смог сохранить строки результирующего набора в ArrayList, а затем преобразовать этот ArrayList в массив объектов, и в combobox будут перечислены правильные элементы, но как объекты. Я просто не могу привести этот ArrayList к строковому массиву. Кто-нибудь знает, возможно ли это? Вот некоторые из моих правил...

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

может кто-нибудь предложить какие-либо предложения? Спасибо!


обновление:

вот трассировка стека, которую я получаю:

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)

3 ответов


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

Это правильный ответ. Причина исключения в том, что все объекты на самом деле не строки.

вам нужно изменить это:

   Object value = rs.getObject(i);

для этого:

   String value = rs.getString(i);

или такой:

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

этот последний будет нуждаться в нулевой проверке, если вы можете возвращать нулевые столбцы.

обратите внимание, что представление toString() может быть не совсем то, что вы ищете во всех случаях, но он получит вас начатый.

Edit: если вы заполняете поле со списком, вам понадобится один столбец на строку, нет? Если нет, вам нужно представить всю строку в виде строки каким-то образом. Затем вы помещаете это в значение и помещаете значение непосредственно в окончательный список массивов, поэтому ваш цикл должен выглядеть так:

    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;

почему бы не использовать rs.getString (). Однако я не рекомендую этого делать. Но это решит твою проблему. Я имею в виду просто строку с самого начала. Пример,

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

теперь вам нужно получить его, как показано ниже.

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

еще лучше проверить тип и получить значения соответствующим образом, используя метаданные, которые у вас есть. Это поможет вам отформатировать данные, а именно даты и дубли.


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

приведенный выше код преобразует строку в массив строк. Теперь в вашем случае вы создаете список объектов, поэтому вы не можете напрямую преобразовать его в массив строк. Как правило, у вас есть 2 варианта:

  1. первоначально определите свой список как список строк и при заполнении списка преобразуйте свои значения в строки (эфир, выполняя Object#toString или извлекая / генерируя meningful String value) и сохраните это в своем списке, например, в своем коде этот String value = rs.getObject(i).toString();
  2. если вы не сделаете этого на шаге 1, вам придется выделить строковый массив, перебрать список, преобразовать текущее значение в строку и вставить его в массив. Я бы выбрал вариант 1.

Так же, как Примечание - методы в Java должны начинаться с строчной буквы