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

Java 结果集未给出值(未在while循环中输入),java,android,Java,Android,我在android中有以下代码: protected void onPostExecute(ResultSet rsData) { try { int size=0; while(rsData.next()) { size++; } m

我在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结果集中有7行

但一旦它出现在第二个while循环中,它就突然不进入while循环,控制直接转到第行:
con.UpdateMessage(mlst)

我不明白为什么会这样

如果resultset中有7行,那么它应该在其中输入7次,但它没有输入一次

请帮帮我。

-

将光标从当前位置向前移动一行。A. 结果集光标最初位于第一行之前;这个 对方法next的第一次调用使第一行成为当前行;这个 第二次调用使第二行成为当前行,依此类推

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

您可以使用
ResultSet#beforeFirst
在第二个
之前使用while loop
将光标移回正常位置,但如果您使用
ArrayList
而不是数组,它会动态调整大小,因此无需关心大小,它会提高代码性能

List<String> mlst = new ArrayList<>();
...
mlst.add(mid);
List mlst=new ArrayList();
...
mlst.add(mid);
-

将光标从当前位置向前移动一行。A. 结果集光标最初位于第一行之前;这个 对方法next的第一次调用使第一行成为当前行;这个 第二次调用使第二行成为当前行,依此类推

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

您可以使用
ResultSet#beforeFirst
在第二个
之前使用while loop
将光标移回正常位置,但如果您使用
ArrayList
而不是数组,它会动态调整大小,因此无需关心大小,它会提高代码性能

List<String> mlst = new ArrayList<>();
...
mlst.add(mid);
List mlst=new ArrayList();
...
mlst.add(mid);

问题在于

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();
            }
        }

问题是我们的

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();
            }
        }
你可能想做什么

rsData.beforeFirst()

就在第二个while循环之前

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

您可能想这样做

rsData.beforeFirst()

就在第二个while循环之前

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

更改光标位置。调用两次会导致错误

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

更改光标位置。调用两次会导致错误

while(rsData.next())
{
   size++;
}
您可以使用
List
而不是
String
数组,这样您就不需要在获取数据之前获取大小。这样,您只能使用第二个循环

while(rsData.next())
{
   size++;
}
在此之后,您已经位于结果集的最后一行。旁边什么都没有


在此之后,您已经位于结果集的最后一行。旁边没有任何内容。

创建语句时,请尝试以下操作:

connection.prepareStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

创建语句时,请尝试以下操作:

connection.prepareStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

意味着我应该怎么做才能将其放在第一行?我们如何移动光标以重新开始?您可以使用
ResultSet#beforeFirst
将光标移回正常状态。但它也会在同一语句rsData.beforeFirst()
ResultSet#beforeFirst
抛出
SQLException
-如果发生数据库访问错误;此方法在已关闭的结果集上调用,或者结果集类型为type_FORWARD_ONLYmeans如何将其放在第一行?如何移动光标以重新开始?您可以使用
ResultSet\beforeFirst
将光标移回正常状态。但在同一语句rsData.beforeFirst()上,它也会将异常设置为null
ResultSet#beforeFirst
在发生数据库访问错误时抛出
SQLException
;此方法是在关闭的结果集上调用的,或者结果集类型是type_FORWARD_only yohh thanx rsData。first()我不知道这一点,我犯了一个错误,它应该是
rsData。beforeFirst()
不是
first()
,因为
next()
获取下一个元素。如果要编写
rsData.first()
,则在第二个while循环中使用的第一个元素将是结果集中的第二个元素,而不是第一个。它会在该语句rsData.beforeFirst()NullPointerException或SQLException上给我异常null吗?不管怎样,这都很奇怪。对不起,我问的是,异常发生在哪一行以及异常的类型(类)?ohh thanx rsData.first()我不知道我犯了一个错误,它应该是
rsData.beforeFirst()
不是
first()
,因为
next()
获取下一个元素。如果要编写
rsData.first()
,则在第二个while循环中使用的第一个元素将是结果集中的第二个元素,而不是第一个。这会导致该sta上出现异常null