ti-enxame.com

Como verificar se um cursor está vazio?

Quando estou tentando obter os números de telefone da lista de contatos do telefone. O problema é que, quando estou executando o aplicativo enquanto a lista de contatos do telefone está vazia, o aplicativo é interrompido. Eu verifiquei e isso é porque o cursor está vazio.

Como posso verificar se o cursor está vazio ou se há contatos na lista de contatos do telefone?

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();
23
Yossi Zloof

Eu adicionei uma projeção para que você esteja obtendo apenas a coluna de que precisa.

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

O padrão geral para testar um cursor "válido" é

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

O provedor de contatos não retorna nulo, mas outros provedores de conteúdo podem fazer isso se encontrarem algum tipo de erro de dados. Um provedor de conteúdo deveria manipula Exceções, define o cursor como zero e registra a exceção, mas não há garantia.

44
Joe Malin

Use cursor.getCount() == 0. Se verdadeiro, o cursor está vazio

24
Gabe Sechan
public boolean isCursorEmpty(Cursor cursor){
   return !cursor.moveToFirst() || cursor.getCount() == 0;
}
4
Cao Manh Dat

Tente este. O problema do seu código é que ele executará add independentemente do comprimento do cursor. Eu incluo os phones.moveToFirst () na instrução if, pois retornará false se o cursor estiver vazio ou não tiver um conjunto de registros.

  if(phones.moveToFirst()){
       do{
          lstPhoneNumber.add(phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); 
        }while(phones.moveToNext())
   } else {
        //do something else
   }
4
Ariel Magbanua
System.out.println("count "+ cursor.getCount());

Isso mostrará o valor do cursor em logcat

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

isBeforeFirst() depois de uma moveToFirst() também funciona bem.

De acordo com o documentação do cursor :

isBeforeFirst (): Retorna se o cursor está apontando para a posição antes da primeira linha.

1
Christopher J.