结果集未给出值(不在while循环中输入)

时间:2013-09-12 06:50:27

标签: java android

我在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次,但它不会输入一次。

请帮帮我。

6 个答案:

答案 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#next -

  

将光标从当前位置向前移动一行。一个   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);