1

私はアンドロイドで次のコードを持っています:

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 行あることを意味します。

しかし、2 番目の while ループになるとすぐに、突然 while ループに入らず、制御は直接 line に移動します。con.UpdateMessage(mlst);

なぜそうなるのか理解できませんか?

結果セットに7行ある場合、7回入力する必要がありますが、1回入力しません。

私を助けてください。

4

6 に答える 6

3

問題は、

while(rsData.next())
{
    size++;
}

カーソルを結果セットの最後に移動します。したがって、2 番目の 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 に答える
2

ResultSet#next-

カーソルを現在の位置から 1 行前方に移動します。ResultSet カーソルは、最初は最初の行の前に配置されます。メソッド next の最初の呼び出しでは、最初の行が現在の行になります。2 番目の呼び出しでは、2 番目の行が現在の行になります。

したがって、最初にwhileループでカーソルを最後の行に移動します。そのため、2 番目の while ループはすでに終了しているので、エスケープします。

カーソルを通常に戻すResultSet#beforeFirst前に秒を使用することもできますが 、動的にサイズ変更可能な配列の代わりに使用すると、サイズを気にする必要がなくなり、コードのパフォーマンスが向上します。while-loopArrayList

List<String> mlst = new ArrayList<>();
...
mlst.add(mid);
于 2013-09-12T06:53:20.673 に答える
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 に答える