Подтвердить что ты не робот

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

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

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

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();
4b9b3361

Ответ 1

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

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();
}

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

В соответствии с Документация курсора:

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