Как проверить, пуст ли курсор?
когда я пытаюсь получить номера телефонов из списка контактов телефона. Проблема в том, что когда я запускаю приложение, пока список контактов в телефоне пуст, приложение останавливается. Я проверил его, и это потому, что курсор пуст.
Как я могу проверить, пуст ли курсор или есть ли какие-либо контакты в списке контактов телефона?
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, но другие поставщики контента могут сделать это, если они сталкиваются с какой-то ошибкой данных. Поставщик контента должны обрабатывать исключения, установить курсор на ноль и зарегистрировать исключение, но нет никакой гарантии.
попробуйте этот. Проблема вашего кода в том, что он будет выполнять 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(): Возвращает, указывает ли курсор на позицию перед первой строкой.