Почему мой курсор Android не доходит до конца исходного «обещания»??
Мой cursor.getCount() отличается от моего последнего cursor.getPosition(). Проверьте мой цикл while! Это все, что я делаю с ним!
Примечания: 1. речь идет о запросе поставщика содержимого контактов (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() будет отображать данные из курсора + выполнять другие запросы: один 4 телефона, один 4 электронных письма, один 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 показывает случайность; пример: оставить их все: last cursor.getPosition() иногда отображает 254, 257, 253 и т. д.; оставляя только телефон и IM: 514, 510, 511 и т. д. (такие разные RUN -> разные last cursor.getPosition() VALUE)
Итак, мнения.. Почему так? Это связано с памятью?
Обновление: оставлено любое из моих отображений writeXEntities в конце logcat: Удаление мертвого поставщика контента: контакты
Обновление 2 Добавление cursor.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 открытым .. был ответ?!?
write
функций, то, что вы опубликовали, должно работать нормально. - person Sam   schedule 03.06.2012