私の 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 カーソルを開いたままにしておくのが正解だったのでは?!?