2013-02-21 3 views
18

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

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

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(); 
+0

Избавьтесь от звонков phones.moveToFirst() и 1stPhonenumber.add .. оставьте свой цикл while. исправлено. – dymmeh

+0

Кроме того, попробуйте перейти в проекцию столбцов, на которые вы запрашиваете. Нет необходимости извлекать все столбцы (путем передачи нулевого значения для проекции), когда вам нужно только 1. – dymmeh

ответ

8

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

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

это буква L :) –

+0

О, ха-ха .. Я не умею читать :) – dymmeh

+0

Спасибо, что сработало отлично! –

21

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 
    } 
+0

Или просто сделать цикл while. Добавление дополнительного, если вместе с do/while выглядит уродливо и добавляет бессмысленную логику – dymmeh

29

Общая схема для проверки на «действительный» курсор

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

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

4
public boolean isCursorEmpty(Cursor cursor){ 
    return !cursor.moveToFirst() || cursor.getCount() == 0; 
} 
1
cursor.moveToFirst(); 
if (cursor.isBeforeFirst()) //means empty result set 
     ; //do your stuff when cursor is empty 

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

Согласно Cursor documentation:

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

Смежные вопросы