这里首先提出问题,完成新手,所以尽量放轻松。我想弄清楚这里有什么问题:
public List<String[]> idOnlyQuery(String searchTerm, Connection conn){
List<String[]> result = new ArrayList<String[]>();
String[] rowResult = new String[7];
Statement stmt = null;
try {
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery( "SELECT * FROM Jets WHERE CurrentID LIKE '" + searchTerm + "%'");
while(rs.next()){
String currentId= rs.getString("CurrentId");
String manufacturer = rs.getString("Constructor");
String type = rs.getString("ACType");
String series = rs.getString("Series");
String index = rs.getString("KeyNo");
String operator = rs.getString("Operator");
String baseAirport = rs.getString("Home_Airfield");
rowResult[0] = (currentId);
rowResult[1] = (manufacturer);
rowResult[2] = (type);
rowResult[3] = (series);
rowResult[4] = (operator);
rowResult[5] = (baseAirport);
rowResult[6]= (index);
result.add(rowResult);
}
System.out.println(result.get(0)[0]);
此方法返回字符串数组列表,这些数组是从SQLite数据库中检索的。除了我的结果List
中的字符串数组似乎每次while循环重复时都被覆盖的事实之外,一切都有效。最后一个println
总是给我从数据库中检索到的最后一行的currentId
,但如果我在println
循环中放置一个while
,它会返回每个String[]
的相应数据循环。我真的无法弄清楚我的{{1}}元素被覆盖的位置。这可能是显而易见的,但我花了几个小时在网上查看我是否正确地进行了添加程序,但仍然没有快乐。帮助!
答案 0 :(得分:2)
您需要在循环中创建rowResult
数组。你的列表只包含一个指向数组的指针,你基本上只使用一个实例。
答案 1 :(得分:1)
在初始化之前每次使用rowResult = new String[7];
时。
这是因为,数组是Java中的对象,所以基本上你一次又一次地改变同一个对象的值。
答案 2 :(得分:0)
这是因为你要重新分配数组位置:
rowResult[0] = (currentId);
rowResult[1] = (manufacturer);
rowResult[2] = (type);
rowResult[3] = (series);
rowResult[4] = (operator);
rowResult[5] = (baseAirport);
rowResult[6]= (index);
在while循环中创建一个临时String
数组,并将其添加到result
:
while (rs.next()) {
String[] rowResult = new String[7];
..
// do your stuff
result.add(rowResult);
}
每次while
循环执行时,它都会将其添加到result
,您将重新开始。
答案 3 :(得分:0)
您正在覆盖rowResult对象。您必须创建一个新的,填充它并在每次迭代时将其添加到列表中。你做的就像拿一个篮子,把它装满橙子并把它放在架子上,然后取出同样的篮子,把橘子扔出来放入新的。
public List<String[]> idOnlyQuery(String searchTerm, Connection conn){
List<String[]> result = new ArrayList<String[]>();
Statement stmt = null;
try {
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery( "SELECT * FROM Jets WHERE CurrentID LIKE '" + searchTerm + "%'");
while(rs.next()){
String[] rowResult = new String[7];
rowResult[0] = rs.getString("CurrentId");
rowResult[1] = rs.getString("Constructor");
rowResult[2] = rs.getString("ACType");
rowResult[3] = rs.getString("Series");
rowResult[4] = rs.getString("Operator");
rowResult[5] = rs.getString("Home_Airfield");
rowResult[6] = rs.getString("KeyNo");
result.add(rowResult);
}
System.out.println(result.get(0)[0]);
}
catch (Exception e) {}
}
答案 4 :(得分:0)
您对所有行使用相同的rowResult数组。放行
String[] rowResult = new String[7];
在while循环中,一切都会正常工作。
答案 5 :(得分:0)
你一遍又一遍地重写String数组。尝试在每个循环中创建一个新数组。
List<String[]> result = new ArrayList<String[]>();
String[] rowResult;
Statement stmt = null;
try {
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery( "SELECT * FROM Jets WHERE CurrentID LIKE '" + searchTerm + "%'");
while(rs.next()){
rowResult = new String[7]; //Create a new object
String currentId= rs.getString("CurrentId");
//...
}
这是因为当你这样做时:
rowResult = new String[7]; //Create a new object
此变量指向内存中的对象:
rowResult -------------> new String[7]
因此,如果我遍历结果集并使用rowResult进行写操作,我确实只修改了一个对象(通过每次添加它到列表中,你只有很多变量指向同一个对象):
result.get(0) -------------->|
result.get(1)--------------->| String[7]
result.get(n)--------------->|
当通过new运算符创建循环中的新数组时,您确实需要一个新的新对象:
result.get(0) -------------->| String[7]
result.get(1)--------------->| String[7]
result.get(n)--------------->| String[7]