КонтактыКонтракт и исполнение

Я хочу поместить в список все контактные номера. Некоторые контакты имеют более одного номера телефона, и я хочу отобразить список следующим образом:

Pippo
Number : +393934578987
Pippo
Number : +394578952364
Topolino
Number : +45124578972
Minnie
Number : +39454545445b
Minnie
Number : +39457879758
etc

Я использовал SimpleAdapter со списком и картами, но производительность была плохой... чем я решил использовать SimpleCursorAdapter и для доступа к таблице ContactsContract и ContactsContract.CommonDataKinds.Phone CursorJoiner с этим кодом

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

Но это не работает

кто-нибудь скажет мне, почему?

Спасибо


person Mimmo    schedule 15.02.2011    source источник


Ответы (2)


Я, наконец, работаю над этим в эти дни. Я добавляю кое-что в случае LEFT, чтобы перемещать курсор, и прерывать его в случае RIGHT, когда левый курсор выходит за пределы (на самом деле isAfterLast())

case LEFT:
rightcursor.moveToPrevious();
......
rightcursor.moveToNext();
break;

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

Не уверен, что это поможет и какая у вас проблема.

person Sean    schedule 26.10.2011

Возможно, вы пропустили вызов matrix_cursor.moveToFirst().

person haggai_e    schedule 13.09.2011