studio programacion herramientas fundamentos con avanzado aplicaciones android cursor android-contacts

android - programacion - ¿Cómo comprobar si un cursor está vacío?



manual de android en pdf (7)

Agregué una proyección para que solo obtengas la columna que necesitas.

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

Cuando intento obtener los números de teléfono de la lista de contactos del teléfono. El problema es que cuando ejecuto la aplicación mientras la lista de contactos en el teléfono está vacía, la aplicación se detiene. Lo comprobé y esto es porque el cursor está vacío.

¿Cómo puedo verificar si el cursor está vacío o si hay algún contacto en la lista de contactos del teléfono?

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


El patrón general para probar un cursor "válido" es

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

El proveedor de contactos no devuelve un valor nulo, pero otros proveedores de contenido pueden hacerlo si encuentran algún tipo de error de datos. Un proveedor de contenido debe manejar las excepciones, establecer el cursor en cero y registrar la excepción, pero no hay garantía.


Prueba este. El problema de su código es que ejecutará la adición independientemente de la longitud del cursor. Encierro los phones.moveToFirst () en la instrucción if, ya que devolverá false si el cursor está vacío o no tiene ningún conjunto de registros.

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


Utilice cursor.getCount() == 0 . Si es verdadero, el cursor está vacío


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() después de que moveToFirst() también funciona bien.

Según la documentación del cursor :

isBeforeFirst (): devuelve si el cursor está apuntando a la posición antes de la primera fila.


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

Esto mostrará el valor del cursor en logcat