1

我在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 循环中,大小的值变为 7。

表示 rsData ResultSet 中有 7 行。

但是一旦进入第二个while循环,它就突然不进入while循环,控制直接进入:con.UpdateMessage(mlst);

我无法理解为什么会这样?

如果结果集中有 7 行,那么它应该输入 7 次,但它不会输入一次。

请帮我。

4

6 回答 6

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();
            }
        }
于 2013-09-12T06:54:21.870 回答
3

你可能想做

rsData.beforeFirst();

就在第二个while循环之前。

您已经通过了整个结果集一次,并且刚刚通过了最后一条记录。您还没有告诉 ResultSet 您想从头开始另一个迭代。

于 2013-09-12T06:55:17.763 回答
2

ResultSet#next-

将光标从其当前位置向前移动一行。ResultSet 游标最初位于第一行之前;第一次调用 next 方法使第一行成为当前行;第二次调用使第二行成为当前行,依此类推。

所以你首先 while 循环将光标移动到最后一行。所以在第二个while循环中它已经是最后了,所以它逃脱了。

您可以使用ResultSet#beforeFirstbefore secondwhile-loop将光标移回正常状态,但如果您使用ArrayList 动态调整大小的数组而不是数组会更好,因此无需关心大小,它可以提高代码性能。

List<String> mlst = new ArrayList<>();
...
mlst.add(mid);
于 2013-09-12T06:53:20.673 回答
2

rsData.next()改变光标位置。调用它两次会导致错误。

您可以使用List<String>而不是String数组,这样您就不需要在数据之前获取大小。这样,您只能使用第二个循环。

于 2013-09-12T06:55:38.277 回答
1
while(rsData.next())
{
   size++;
}

在此之后,您已经在结果集的最后一行。旁边没有任何东西。

于 2013-09-12T06:59:21.933 回答
1

试试这个,同时创建语句:

connection.prepareStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
于 2013-09-12T07:26:29.110 回答