Как проверить, пуст ли курсор?

когда я пытаюсь получить номера телефонов из списка контактов телефона. Проблема в том, что когда я запускаю приложение, пока список контактов в телефоне пуст, приложение останавливается. Я проверил его, и это потому, что курсор пуст.

Как я могу проверить, пуст ли курсор или есть ли какие-либо контакты в списке контактов телефона?

ArrayList<String> lstPhoneNumber = new ArrayList<String>();
Cursor phones = getContentResolver().query(
        ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null); 
lstPhoneNumber = new ArrayList<String>();

phones.moveToFirst();
// The problematic Line:
lstPhoneNumber.add(phones.getString(phones.getColumnIndex(
        ContactsContract.CommonDataKinds.Phone.NUMBER))); 
while (phones.moveToNext()) {
    lstPhoneNumber.add(phones.getString(phones.getColumnIndex(
            ContactsContract.CommonDataKinds.Phone.NUMBER))); 
}
phones.close();

7 ответов


Я добавил в проекцию, поэтому вы получаете только нужный столбец.

String[] projection = new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER };
ArrayList<String> lstPhoneNumber = new ArrayList<String>();
Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
        projection, null, null, null);
if (phones == null)
    return; // can't do anything with a null cursor.
try {
    while (phones.moveToNext()) {
        lstPhoneNumber.add(phones.getString(0));
    }
} finally {
    phones.close();
}

общий шаблон для проверки "действительного" курсора -

((cursor != null) && (cursor.getCount() > 0))

поставщик контактов не возвращает null, но другие поставщики контента могут сделать это, если они сталкиваются с какой-то ошибкой данных. Поставщик контента должны обрабатывать исключения, установить курсор на ноль и зарегистрировать исключение, но нет никакой гарантии.


использовать cursor.getCount() == 0. Если true, курсор пуст


попробуйте этот. Проблема вашего кода в том, что он будет выполнять add независимо от длины курсора. Я прилагаю телефоны.moveToFirst () в операторе if, так как он вернет false, если курсор пуст или не имеет набора записей.

  if(phones.moveToFirst()){
       do{
          lstPhoneNumber.add(phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); 
        }while(phones.moveToNext())
   } else {
        //do something else
   }

public boolean isCursorEmpty(Cursor cursor){
   return !cursor.moveToFirst() || cursor.getCount() == 0;
}

cursor.moveToFirst();
if (cursor.isBeforeFirst()) //means empty result set
        ; //do your stuff when cursor is empty

isBeforeFirst() после moveToFirst() хорошо работает также.

По словам документация Курсора:

isBeforeFirst(): Возвращает, указывает ли курсор на позицию перед первой строкой.


System.out.println("count "+ cursor.getCount());

Это покажет значение курсора в logcat