2010-12-19 44 views
7

我试图读取所有使用RawContacts.entityIterator的接触,但我看到这个错误:android.database.CursorIndexOutOfBoundsException:指数-1要求

android.database.CursorIndexOutOfBoundsException:指数-1要求

以下是我的代码:

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

有人可以告诉我什么是错我的代码。

+0

发生异常的行号。如果你粘贴日志,它会更容易回答你的问题 – Varun 2010-12-19 06:38:55

回答

24

你执行query后,你必须调用cur.moveToFirst() ...

试试这个

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

非常感谢。这工作!我还有另一个问题。如何从entityiterator获取人类可读形式的联系人详细信息? – 2010-12-19 07:17:17

+0

@Andy,这是一个不同的问题,但我不认为有一个简单的方法...您需要使用'getEntityValues()'来获取'ContentValues()'并自己显示它们....也许你可以把它作为一个问题,其他人可能会有更好的帮助。 – st0le 2010-12-19 07:30:32

2

它不需要调用moveToFirst但是,以确保您访问之前,移动到任何返回的行一个值(请参阅moveToLast(),moveToPosition(int position),...)。

所以这一个:

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; 

会工作,以及 - 甚至更好,因为有一个问题与接受的答案,如果继续...

while (cur.moveToNext()) { 

if (cur.getCount() > 0) { 

它会跳过第一行,什么大小不明显。

相关问题