¿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?
- Obtener la posición del cursor Android Keyboard
- El error del cursor en Android me dice que la columna no existe
- ¿Qué es más rápido: un Cursor o ArrayList?
- Android desventajas de no cerrar el cursor
- Recuperar blob de gran tamaño de la base de datos Android sqlite
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();
- Android ContentProvider Esquema de URI para notificar a CursorAdapters escuchando consultas de OUTER JOIN
- Iterar a través de filas desde Sqlite-query
- Método startManagingCursor (cursor) obsoleto
- Imágenes en SimpleCursorAdapter
- EditText en ListView sin reciclar entrada
- Limitación de una consulta SQLite en android
- Cómo utilizar la consulta para el argumento de selección múltiple utilizando una columna de selección
- Android: CursorLoader falla en Fragmento no superior
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.
- Error al azar de SQLiteConnectionPool en Android. ¿Como evitar?
- ¿Hay alguna versión de Android de R (sin enraizar el dispositivo)?