3

私の Android カーソルが元の「約束」の最後まで行かないのはなぜですか??

私のcursor.getCount()は私の最後のcursor.getPosition ()とは異なります。私のwhileループをチェックしてください!それは私がそれで行うすべてです!

: 1. Contacts コンテンツ プロバイダー (android api >5) のクエリに関するものです 2. 重要なコードのみを表示します

Cursor cursor = mContext.getContentResolver().query(mUri, mProjections, null, null, null);
Logger.d(TAG, "***  cursor.getCount(): "+cursor.getCount());
while (cursor.moveToNext()) {
    Logger.d(TAG, "| position: "+cursor.getPosition());
    processMainCursor(serializer, cursor);
}
cursor.close();

processMainCursor() は、カーソルからのデータを表示し、別のクエリを実行します: 1 つの 4 つの電話、1 つの 4 つの電子メール、1 つの 4 つの IM アカウント:

void processMainCursor(XmlSerializer serializer, Cursor main_cursor) {
     writeCursorData(serializer, main_cursor); //writes cursor data, column by column
     writePhoneEntities(serializer, main_cursor);
     writeEmailEntities(serializer, main_cursor);
     writeIMEntities(serializer, main_cursor);
}

私の方法のどれも、私をwriteXXX閉じmain_cursorたり、次に移動したりしません!!!..それについて私を信頼する必要があります..私はただ新しいクエリを実行し、データを出力してそのカーソルを閉じます

だから統計:

  • cursor.getCount() = 695 (常に)
  • コメントwritePhoneEntities、writeEmailEntities、writeIMentities : cursor.getCount() = last cursor.getPosition() = 695 (正解! )
  • 私のwriteXEntitiesの1つ/ 2つ/すべてを残すと、ランダム性が示されます。例: それらをすべて残す: last cursor.getPosition() は 254、257、253 などを表示することがあります。電話と IM だけを残す: 514、510、511 など (異なる RUN -> 異なる last cursor.getPosition() VALUE )

だから意見..それはなぜですか?メモリ関連ですか?

更新: logcat の最後に私の writeXEntities の表示を残す: デッド コンテンツ プロバイダーの削除: 連絡先

更新 2cursor.moveToFirst();ループの 追加 と実行

do {
    //do whatever you want
} while (cursor.moveToNext()); 

仕事をしなかった..

したがって、おそらく答えは次の logcat エントリにあります。

05-21 23:29:30.209: I/ActivityThread(7085): Removing dead content provider: contacts
05-21 23:29:30.209: I/ActivityThread(7085): Removing dead content provider: com.android.contacts

削除された writeXEntity のサンプル

解決策.. writeXEntityからのカーソルを正しく閉じていませんでした (おそらく、メインの後にかなりの数の開いたカーソルを残します)

実際、私はこのように閉じていました

if(phone_cursor!=null && phone_cursor.getCount() > 0)
{                   
     //... stuff
     phone_cursor.close();
}

ifの後に閉じるべきだった

if(phone_cursor!=null && phone_cursor.getCount() > 0)
{                   
     //... stuff
}
phone_cursor.close();

Basilion カーソルを開いたままにしておくのが正解だったのでは?!?

4

4 に答える 4

9

カーソルを最初の行に移動する必要があります。ループcur.moveToFirst()の前に追加してみてください。while

do-whileループの使用を検討することもできます。これにより、カーソルの最初の行をスキップしないことが保証されます。

if (cursor.moveToFirst()) {
    do {
        //do whatever you want
    } while (cursor.moveToNext());               
}
cursor.close();
于 2012-06-03T17:02:50.537 に答える
0

以下に示すようにカーソルを使用します。

             if(cursor.getCount() == 0)
              {                   
                 //No entry found
              }
              else  {
                  cursor.moveToFirst();
                  do {
                     //do whatever you want
                     } while (cursor.moveToNext());               
            cursor.close();
于 2012-06-03T17:09:02.630 に答える
0

getCount がアイテムの数であり、position が位置であるため、それらは同じ数にはなりません (最初のものは 0 です)。そのため、最終的な位置は常にカウントより 1 つ少なくする必要があります。

それ以外の場合は、あなたの質問を正しく理解していないと思います。

于 2012-06-03T17:04:54.637 に答える