2016-05-02 16 views
0

2行のデータを持つ表の上にカーソルを置いて繰り返したいとします。私の最初の試みでした:カーソルisAfterLast()は、最後の行に達したときにtrueを返します。

c.moveToFirst(); 
while(!c.isAfterLast()){ 
//this code runs once 
c.moveToNext(); 
} 

しかし、デバッグの後、私は私が私のデータの最後の行が欠落していますことに気づきました。これは、mPos変数がカウンタのmCountに等しくなったときにwhileループが終了するためです。問題は以下のいずれかで上記のコードを置き換えた後に解決された:

c.moveToFirst(); 
do{ 
//this code runs twice 
}while(c.moveToNext()) 

を本質的に第1の方法では、whileループは、第1未満1回実行されます。カーソルが最後の行を通過した後にisAfterLastがtrueを返すとは思われませんか?それはカーソルを移動 - moveToNext()は(true)次があることを意味booleanを返すだけでなく、真の場合、その

+1

あなたが最初のコードブロックでは、あなたが持っていたと確信している 'c.moveToNext()'のコードの最後の行として。 whileループの中で?両方とも本当に同じことをしてください。 –

+0

あなたはru nデータ行が1つしかないカーソル上の最初のコードブロック?ループの本体がまったく実行されないようにしますか?つまり、c.isAfterLast()はc.moveToFirst()の呼び出しの直後にtrueを返しますか? – jason44107

+0

その場合、最初のブロックを_empty_カーソルで実行するとどうなりますか?それは例外をスローしますか? – jason44107

答えて

1

注意。この場合、c.moveToNext();の後にwhile(!c.isAfterLast())を評価するために戻ると、最後の行の後の位置をカーソルが指していることになります。

目的がカーソルで繰り返される場合は、あなただけのこの操作を行うことができます。

while (c.moveToNext()) { 
    //do whatever with your data - like 
    //String value = c.getString(c.getColumnIndex("SOME_COLUMN_NAME")); 
} 
あなたは関連する説明を見ることができます

here

+0

質問の2つのコードブロックは、実際に同じことを行う必要があります。参照:http://stackoverflow.com/questions/10723770/whats-the-best-way-to-iterate-an-android-cursor –

関連する問題