我使用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或数组中?
答案 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