2010-12-19 10 views
7

Estoy intentando leer todos los contactos usando RawContacts.entityIterator pero estoy viendo este error:android.database.CursorIndexOutOfBoundsException: Índice -1 solicitó

android.database.CursorIndexOutOfBoundsException: Índice -1 solicitado

que sigue es mi código:

ContentResolver cr = getContentResolver(); 
     Cursor cur = cr.query(Contacts.CONTENT_URI, 
     null, null, null, null); 

String id = cur.getString(cur.getColumnIndex(Contacts._ID)); 

if (cur.getCount() > 0) { 
     while (cur.moveToNext()) { 
     final Uri uri = RawContactsEntity.CONTENT_URI; 
      final String selection = Data.CONTACT_ID + "=?"; 
      final String[] selectionArgs = new String[] {id}; 

      final Map<String, List<ContentValues>> contentValuesListMap = 
       new HashMap<String, List<ContentValues>>(); 
      EntityIterator entityIterator = null; 

      entityIterator = RawContacts.newEntityIterator(cr.query(
        uri, null, selection, selectionArgs, null)); 

      while (entityIterator.hasNext()) { 
       Entity entity = entityIterator.next(); 
       for (NamedContentValues namedContentValues : entity.getSubValues()) { 
        ContentValues contentValues = namedContentValues.values; 
        String key = contentValues.getAsString(Data.MIMETYPE); 
        if (key != null) { 
         List<ContentValues> contentValuesList = 
           contentValuesListMap.get(key); 
         if (contentValuesList == null) { 
          contentValuesList = new ArrayList<ContentValues>(); 
          contentValuesListMap.put(key, contentValuesList); 
         } 
         contentValuesList.add(contentValues); 
        } 
       } 
      } 
      Log.i(tag, "Contact index=" + id); 
     } 
    } 

Puede alguien por favor dígame qué le pasa a mi código.

+0

número de línea en el que se produce una excepción. y será más fácil para las personas responder si se pegan los registros – Varun

Respuesta

24

Después de ejecutar query, debe llamar cur.moveToFirst() ...

Prueba este

ContentResolver cr = getContentResolver(); 
     Cursor cur = cr.query(Contacts.CONTENT_URI, 
     null, null, null, null); 

if(cur != null && cur.moveToFirst()) 
{ 
     String id = cur.getString(cur.getColumnIndex(Contacts._ID)); 

     if (cur.getCount() > 0) { 
     ... 
+0

Muchas gracias. ¡¡Eso funciono!! Sin embargo, tengo otra pregunta. ¿Cómo obtengo la forma legible por humanos de los datos de contacto del entityiterator? –

+0

@Andy, esa es una pregunta diferente, pero no creo que haya una manera directa ... Tendrá que usar 'getEntityValues ​​()' para obtener 'ContentValues ​​()' y mostrarlos usted mismo .... Tal vez podrías preguntarlo como una pregunta, otros podrían ser de mejor ayuda. – st0le

2

No es necesario llamar a moveToFirst sino garantizar que movió a cualquiera de las filas devueltas antes de acceder un valor (vea moveToLast(), moveToPosition(int position), ...).

Así que éste:

Cursor cur = cr.query(Contacts.CONTENT_URI, null, null, null, null); 

while (cur.moveToNext()) { 
    String id = cur.getString(cur.getColumnIndex(Contacts._ID)); 
    final Uri uri = RawContactsEntity.CONTENT_URI; 

funcionaría así - o incluso mejor, porque hay un problema con la respuesta aceptada, si continúa con ...

while (cur.moveToNext()) { 

después de

if (cur.getCount() > 0) { 

Se saltea la primera fila, ¿qué migh? no es obvio

Cuestiones relacionadas