我在android中有以下代码:
protected void onPostExecute(ResultSet rsData)
{
try
{
int size=0;
while(rsData.next())
{
size++;
}
mlst = new String[size];
int i=0;
while(rsData.next())
{
String mid = rsData.getString(rsData.findColumn("mid"));
String uid = rsData.getString(rsData.findColumn("uid"));
String messages = rsData.getString(rsData.findColumn("message"));
String read=rsData.getString(rsData.findColumn("rstamp"));
mdb.addMessage(new Contact(mid, uid, messages, read));
mlst[i]=mid;
i++;
}
con.UpdateMessage(mlst);
}
catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
在这个我保持调试器的每一行。
我发现在第一个while循环中,size的大小变为7。
表示rsData ResultSet中有7行。
但是当它第二次循环时,它突然没有进入while循环并且控件直接进入行:con.UpdateMessage(mlst);
我无法理解为什么会这样发生?
如果结果集中有7行,那么它应该输入7次,但它不会输入一次。
请帮帮我。
答案 0 :(得分:3)
问题在于
while(rsData.next())
{
size++;
}
将光标移动到结果集的末尾。因此,当您尝试运行第二个while循环时,游标已经在结尾,因此循环不会执行。
您必须使用rsData.beforeFirst();
将光标重新设置为开头。生成的代码应如下所示:
protected void onPostExecute(ResultSet rsData)
{
try
{
int size=0;
while(rsData.next())
{
size++;
}
rsData.beforeFirst();
mlst = new String[size];
int i=0;
while(rsData.next())
{
String mid = rsData.getString(rsData.findColumn("mid"));
String uid = rsData.getString(rsData.findColumn("uid"));
String messages = rsData.getString(rsData.findColumn("message"));
String read=rsData.getString(rsData.findColumn("rstamp"));
mdb.addMessage(new Contact(mid, uid, messages, read));
mlst[i]=mid;
i++;
}
con.UpdateMessage(mlst);
}
catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
答案 1 :(得分:3)
您可能想要
rsData.beforeFirst();
在第二个while循环之前。
您已经完成了整个结果集,并且刚刚通过了最后一条记录。您还没有告诉ResultSet您想再次从头开始另一次迭代。
答案 2 :(得分:2)
将光标从当前位置向前移动一行。一个 ResultSet游标最初位于第一行之前;该 首先调用方法接下来使第一行成为当前行;该 第二次调用使第二行成为当前行,依此类推。
所以你先循环移动光标在最后一行。所以在第二次循环时它已经在最后,所以它逃脱了。
您可以在第二个ResultSet#beforeFirst
之前使用while-loop
将光标移回正常状态但是如果您使用ArrayList
代替数组它会动态调整大小会更好,所以无需关心关于大小,它可以提高代码性能。
List<String> mlst = new ArrayList<>();
...
mlst.add(mid);
答案 3 :(得分:2)
rsData.next()
更改光标位置。调用它两次会导致错误。
您可以使用List<String>
代替String
数组,这样您就不需要在数据之前获取大小。这样你只能使用第二个循环。
答案 4 :(得分:1)
while(rsData.next())
{
size++;
}
在此之后,您已经在resultSet的最后一行。它旁边没有任何东西。
答案 5 :(得分:1)
在创建语句时尝试此操作:
connection.prepareStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);