閉じる

moveToNextの罠

moveToNextが falseを返した時、既にカーソル位置は最後の要素の次を示している。
で、続いて moveToPreviousを呼ぶと trueを返し、moveToNextを呼ぶ前の位置にカーソルが移動する。
すなわち、要素が二つあるとし、現在二つ目の要素を示しているとして、後ろへ移動できるかと moveToNextを呼んで失敗し、でなければ前へ移動できるかと moveToPreviousを呼び出すと成功し、いざ要素を取得してみると二つ目の要素が得られるという事になる。
この辺、Cursorの実装に寄るのだと思うけど*1 、仕様的にはどうなのかね?
とりあえず moveToNext呼び出し前の位置を覚えておいて、moveToPrevious呼び出し前に位置を再設定するという対処療法を。
で、AbstractCursor.javaを眺めてみる。
moveToNext/moveToPreviousは単に現在位置に +1/-1して moveToPositionを呼ぶという実装。
moveToPositionは指定された位置が有効範囲の後ろにはみ出るなら後ろの無効値、前にはみ出るなら前の無効値を設定するという実装。
有効範囲が 0~要素数-1、後ろの無効値というのが要素数で、前の無効値が -1となっているので、今回遭遇したような動作になるわけだ。


*1 今回は SQLiteDatabase.rawQueryが返す Cursor

コメントを残す

メールアドレスが公開されることはありません。必須項目には印がついています *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)