Конвертировать результат SQL-запроса в массив строк - PullRequest
4 голосов
/ 16 февраля 2011

Я делаю запросы к базе данных SQLite3 в Java, используя SQLiteJDBC (драйвер JDBC Java для SQLite).

Если я сделаю запрос SQL SELECT name, передайте FROM loginTable WHERE name = '% s'; есть ли функция для возврата ИЛИ Преобразовать строки имени и пароля, возвращенные из запроса, в массив строк или ArrayList?

Следующий код пытается поместить запросы, возвращаемые в список массивов, но это не удается, я знаю, что база данных SQL в порядке и запрос, который я делаю, потому что, когда я делаю это в командной строке, она работает.

ArrayList <String> result = new ArrayList<String>();
ResultSet rs = stat.executeQuery( "SELECT ..." );

for (int i=0; rs.next(); i++)
{
   result.add( rs.getString(i) );
}

Сбой, потому что в таблице loginTable есть столбцы: Index, name, pass. Итак, глядя выше, когда я = 0, и я иду rs.getString (0), он пытается получить строку в столбце индекса.

Ошибка вывода

java.sql.SQLException: столбец 0 вне границ [1,1]

Кто-нибудь знает, как я могу поместить все результаты запроса SQL (объект ResultSet) в ArrayList или массив?

Ответы [ 5 ]

10 голосов
/ 16 февраля 2011

В JDBC столбцы индексируются, начиная с 1, а не с 0.

9 голосов
/ 16 февраля 2011

Чтобы сохранить только столбцы первой строки, попробуйте

int columnCount = rs.getMetaData().getColumnCount();
rs.next();
for (int i = 0; i <columnCount ; i++)
{
   result.add( rs.getString(i + 1) );
}

Если вы хотите сохранить ArrayList<String[]>, который содержит все строки и все столбцы:

ArrayList <String[]> result = new ArrayList<String[]>();
ResultSet rs = stat.executeQuery( "SELECT ..." );
int columnCount = rs.getMetaData().getColumnCount();
while(rs.next())
{
    String[] row = new String[columnCount];
    for (int i=0; i <columnCount ; i++)
    {
       row[i] = rs.getString(i + 1);
    }
    result.add(row);
}

Обновлено за ответ Шона

2 голосов
/ 01 апреля 2013

Это сработало для меня:

public static String[] getRooms() throws SQLException, JSONException, ClassNotFoundException{
    ArrayList<String> a = new ArrayList<String>();

    Class.forName(sqlDriver);
    Connection con = DriverManager.getConnection(dtbSet, dtbUsername, dtbPassword);
    PreparedStatement ps = con.prepareStatement("SELECT room_name FROM "+ dtbTbl2);
    ResultSet rs = ps.executeQuery();

    while(rs.next())
    {
        a.add(rs.getString(1));
    }

    return (String[]) a.toArray(new String[a.size()]);
}
1 голос
/ 16 февраля 2011

Возможно, вы захотите взглянуть на эту структуру.http://commons.apache.org/dbutils/

В частности, вы можете запросить базу данных и вернуть массив запросов.Вот пример в псевдокоде:

ResultSetHandler h = new ArrayListHandler();
QueryRunner qr = new QueryRunner();

List<Object[]> results = (List<Object[]>)qr.query(sql, h);

Также вот еще один веб-сайт, который использует это: http://www.stupidjavatricks.com/?p=45

1 голос
/ 16 февраля 2011

Во-первых, не используйте for loop, потому что вы получаете только один отдельный столбец из каждой строки ... каждый раз, когда вы нажимаете rs.next(), он переходит к следующей строке, прежде чем вы закончите получать все значения столбца из одного ряда. Вместо этого используйте while (rs.next()), чтобы проверить существование строки.

Во-вторых, как упомянул @shaun, столбцы JDBC начинаются с 1, а не с нуля.

В-третьих, чтобы поместить данные в список, вам понадобится объект POJO или бин для хранения всей информации из каждой строки.

Итак, в конце код выглядит примерно так: -

Connection con = ...; 
PreparedStatement ps = con.prepareStatement("SELECT name, pass FROM loginTable WHERE name = ?");
ps.setString(1, "mike");

ResultSet rs = ps.executeQuery();

List<User> users = new ArrayList<User>();

while(rs.next()) {
    String name = rs.getString(1);
    String pass = rs.getString(2);
    users.add(new User(name, pass));
}

...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...