3

私は常に以下のコードを使用してすべての情報を取得しますが、 c.movetoNextが結果セットの最初の行をスキップする
という疑問があります。完全に理解できるように、表面の背後で実際に何が起こっているのか 教えてください。

    SQLiteDatabase db;
    Cursor c = db.query("pic", null, null, null, null,null, null);
    c.moveToFirst();
    while(c.movetoNext)
    {
    //do something
    //example: String a=c.getString(0);
    }
4

5 に答える 5

14

を呼び出しmoveToFirst()てカーソルを最初の行に配置し、moveToNext()ループに入る前に while ループを呼び出すと、最初の行がスキップされます。

do...while ループ、または次のような for ループで解決できます。

for( c.moveToFirst(); !c.isAfterLast(); c.moveToNext() ) {
    // Stuff
}
于 2012-11-29T03:30:16.477 に答える
2

遅い答えですが、このページを見つけた他の人に役立つことを願っています。私は「if () do { } while();」を使用しています。ループ。カーソルに行が返されなかった場合、「moveToFirst()」関数は false を返します。「moveToNext()」関数は、カーソルの終わりを過ぎたときに false を返します。

Cursor c = db.query(......);

if (c.moveToFirst()) do {
   data = c.getString(0) // eg. get value from first column in cursor
   // do something more
} while (c.moveToNext());

c.close();

(これはTactMayersの回答に似ています)。

于 2016-06-21T18:32:20.353 に答える
1

Cursorのドキュメントによると、「クエリ... 戻り値: 最初のエントリの前に配置される Cursor オブジェクト」。さらに、カーソルでメソッドが呼び出されたときにのみクエリが実行されるようです。それが役立つことを願っています。

于 2012-11-29T03:30:27.913 に答える
0

実際には、 c.moveToFirst();を呼び出す必要はありません。まったく

于 2012-11-29T04:42:30.757 に答える
0
c.moveToFirst();

この行は、カーソルを最初の行に移動します。

while(c.movetoNext)

このコード行を実行した後、カーソルは次の行 (while ループの最初の実行では行 2) に移動します。したがって、コードがループに入るまでに、カーソルは既に行 2 を指しており、決してアクセスできません。最初の行。

このようにwhileループを置き換えてみてください

do {
    // do something
} while(c.movetoNext())
于 2012-11-29T03:32:25.163 に答える