首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ContactsContract和性能

ContactsContract和性能
EN

Stack Overflow用户
提问于 2011-02-15 18:36:25
回答 2查看 668关注 0票数 1

我想把所有的联系方式都放到一个列表中。某些联系人有多个电话号码,我希望显示以下列表:

代码语言:javascript
复制
Pippo
Number : +393934578987
Pippo
Number : +394578952364
Topolino
Number : +45124578972
Minnie
Number : +39454545445b
Minnie
Number : +39457879758
etc

我使用了带有List和Map的SimpleAdapter,但性能很差。我决定使用SimpleCursorAdapter和poor...than来访问表ContactsContract,并使用下面的代码ContactsContract.CommonDataKinds.Phone a CursorJoiner

代码语言:javascript
复制
Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1", null, null);
Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + Contacts._ID, null, null);
        String[] cursor_join = new String[]{
                Contacts._ID,
                ContactsContract.Contacts.DISPLAY_NAME,
                ContactsContract.CommonDataKinds.Phone.NUMBER
        };
        MatrixCursor matrix_cursor = new MatrixCursor(cursor_join);
        CursorJoiner cursor_j = new CursorJoiner(cursor, new String[]{Contacts._ID}, phones, new String[]{ContactsContract.CommonDataKinds.Phone.CONTACT_ID});
        for (CursorJoiner.Result joinerResult : cursor_j) {
            String[] values;
            switch (joinerResult) {         
                case LEFT:             // handle case where a row in cursorA is unique             
                    values = new String[]{
                            cursor.getString(cursor.getColumnIndex(Contacts._ID)),
                            cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)),
                            phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))
                        };
                        matrix_cursor.addRow(values);
                    break;         
                case RIGHT:             // handle case where a row in cursorB is unique             
                    break;         
                case BOTH:             // handle case where a row with the same key is in both cursors             
                    values = new String[]{
                            cursor.getString(cursor.getColumnIndex(Contacts._ID)),
                            cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)),
                            phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))
                        };
                        matrix_cursor.addRow(values);
                    break;     
            }
        }
        while(matrix_cursor.moveToNext()){
            contactId = matrix_cursor.getInt(matrix_cursor.getColumnIndex(Contacts._ID));
            String name = matrix_cursor.getString(matrix_cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            String num = matrix_cursor.getString(matrix_cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        }

但是它不起作用。

有人告诉我为什么吗?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2011-10-26 20:48:09

这几天我终于解决了这个问题。我放了一些东西以防向左移动光标,并在向右移动光标超出边界时中断(实际上是isAfterLast())

代码语言:javascript
复制
case LEFT:
rightcursor.moveToPrevious();
......
rightcursor.moveToNext();
break;

case RIGHT:
if(leftcursor.isAfterLast()){break;}
....

不确定这是否有帮助,以及您遇到了什么问题。

票数 2
EN

Stack Overflow用户

发布于 2011-09-13 17:02:51

也许您错过了对matrix_cursor.moveToFirst()的调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5002572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档