将SQL Query结果转换为字符串数组

时间:2011-02-15 23:56:15

标签: java sqlite

我使用SQLiteJDBC(SQLite的Java JDBC驱动程序)在Java中查询SQLite3数据库。

如果我使SQL查询 SELECT名称,则传递FROM loginTable WHERE name ='%s'; 是否有返回或转换名称的函数&将查询返回的字符串传递给String数组或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。所以看看上面,当i = 0时,&amp;我去rs.getString(0),它试图获取Index列中的字符串。

错误输出

  

java.sql.SQLException:第0列超出范围[1,1]

有谁知道如何将SQL查询(ResultSet对象)的所有结果放在ArrayList或数组中?

5 个答案:

答案 0 :(得分:10)

在JDBC中,列从1开始索引,而不是从0开始。

答案 1 :(得分:9)

要仅存储第一行的列,请尝试

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 :(得分:2)

这对我有用:

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()]);
}

答案 3 :(得分:1)

首先,不要使用for loop,因为每行只有一个不同的列...每次点击rs.next()时,它会在你完成之前进入下一行一行中的所有列值。相反,使用while (rs.next())检查行是否存在。

其次,正如@shaun所提到的,JDBC列以1开头,而不是零。

第三,要将数据放入列表中,您需要有一个POJO或bean来保存每行的所有信息。

所以,最后,代码就像这样: -

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

...

答案 4 :(得分:1)

您可能想看一下这个框架。 http://commons.apache.org/dbutils/

具体来说,您可以查询数据库并返回查询的arraylist。这是伪代码中的一个例子:

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

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

此外,这是另一个使用此网站的网站: http://www.stupidjavatricks.com/?p=45