【问题标题】:android.database.CursorIndexOutOfBoundsException: Index -1 requestedandroid.database.CursorIndexOutOfBoundsException:索引 -1 请求
【发布时间】:2010-12-19 06:29:54
【问题描述】:

我正在尝试使用 RawContacts.entityIterator 读取所有联系人,但我看到了这个错误:

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

谁能告诉我我的代码有什么问题。

【问题讨论】:

  • 发生异常的行号。如果您粘贴日志,ppl 会更容易回答

标签: android


【解决方案1】:

执行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) {
         ...

【讨论】:

  • 非常感谢 st0le。那行得通!不过我还有一个问题。如何从 entityiterator 获取人类可读的联系方式?
  • @Andy,这是一个不同的问题,但我认为没有直接的方法......您需要使用 getEntityValues() 来获取 ContentValues() 并自己显示它们。 ..也许您可以将其作为一个问题提出,其他人可能会提供更好的帮助。
【解决方案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) { 

它会跳过第一行,这可能并不明显。

【讨论】:

    猜你喜欢
    • 2022-01-12
    • 1970-01-01
    • 2018-11-04
    • 2012-09-07
    • 2012-05-01
    • 2011-10-14
    • 2014-09-07
    相关资源
    最近更新 更多