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

Cuando estoy tratando de 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 del teléfono está vacía, la aplicación se detiene. Lo he comprobado y esto es porque el cursor está vacío.

¿Cómo puedo comprobar si el cursor está vacío o si hay contactos 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(); 

He añadido en una proyección por lo que sólo está recibiendo la columna que necesita.

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

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

((Cursor! = Nulo) && (cursor.getCount ()> 0)). El proveedor de contactos no devuelve null, pero otros proveedores de contenido pueden hacerlo si encuentran algún tipo de error de datos. Un proveedor de contenido debe manejar excepciones, establecer el cursor a cero y registrar la excepción, pero no hay garantía.

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

Prueba éste. El problema de su código es que ejecutará add independientemente de la longitud del cursor. Adjunto la sentencia phones.moveToFirst () in 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 } 
 public boolean isCursorEmpty(Cursor cursor){ if(!cursor.moveToFirst() || cursor.getCount() == 0) return true return false } 
 cursor.moveToFirst(); if (cursor.isBeforeFirst()) //means empty result set ; //do your stuff when cursor is empty 

isBeforeFirst() después de un moveToFirst() funciona bien también.

De acuerdo con la documentación del cursor :

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

  • Cómo cambiar el color de la burbuja (bajo cursor) en EditView (PROGRAMATICALLY)?
  • ListView no se actualiza al agregar a SQLiteDatabase
  • No se pudo leer la fila 1, col -1 de CursorWindow. Asegúrese de que el cursor se inicialice correctamente antes de acceder a los datos de él
  • ¿Usando SimpleCursorAdapter con Spinner?
  • Android ContentProvider llama ráfagas de setNotificationUri () a CursorAdapter cuando se insertan muchas filas con una operación por lotes
  • Android - SQLite Cursor getColumnIndex () es sensible a mayúsculas y minúsculas?
  • La forma más rápida y rápida de obtener nuevos mensajes sms al iniciar la aplicación - Android
  • Cómo crear Cursor de JSONArray?
  • Implementación correcta de cambiar los datos de ListView con CursorAdapter
  • Cambiar el color del cursor de un EditText en Android a través de todo el sdk
  • Android Cursor? Cómo leer datos de objetos?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.