2010-12-19 11 views
7

staram się czytać wszystkie kontakty za pomocą RawContacts.entityIterator ale widzę ten błąd:android.database.CursorIndexOutOfBoundsException: Index -1 o

android.database.CursorIndexOutOfBoundsException: indeks -1 żądany

Po to mój kod:

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

Czy ktoś mógłby mi powiedzieć, co jest nie tak z mojego kodu.

+0

numer linii, pod którym występuje wyjątek. i łatwiej będzie ppl odpowiedzieć, jeśli wkleisz dzienniki – Varun

Odpowiedz

24

Po wykonaniu query, należy zadzwonić cur.moveToFirst() ...

Spróbuj

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

Bardzo dziękuję. To się udało!! Mam jednak inne pytanie. Jak uzyskać czytelną dla człowieka postać danych kontaktowych od podmiotator? –

+0

@Andy, to inne pytanie, ale nie sądzę, że istnieje prosty sposób ... Będziesz musiał użyć 'getEntityValues ​​()', aby uzyskać 'ContentValues ​​()' i wyświetlić je samemu. możesz zadać to pytanie, inni mogą okazać się lepszą pomocą. – st0le

2

Nie jest wymagane, aby zadzwonić moveToFirst ale aby upewnić się, że przeniósł się do któregokolwiek z wierszy zwróconych przed dostępem wartość (patrz moveToLast(), moveToPosition(int position), ...).

Więc ten jeden:

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; 

będzie działać, jak również - a nawet lepiej, bo tam jest problem z przyjętą odpowiedzi, jeśli nadal z ...

while (cur.moveToNext()) { 

po

if (cur.getCount() > 0) { 

Pominąłby pierwszy wiersz, co nie jest oczywiste.

Powiązane problemy