Лучший способ получить доступ ко всем деталям контактов Android - PullRequest
0 голосов
/ 14 декабря 2011

Я пишу приложение для синхронизации контактной информации с моим сервером.Для этого мне нужно несколько раз запрашивать контакты, используя контент-провайдера, так как все данные отсутствуют в одной таблице.Например, используя идентификатор контакта, я должен отдельно запрашивать таблицы телефона, электронной почты и адреса для каждого контакта, который, по моему мнению, не очень эффективен.Было бы очень полезно, если бы кто-то мог указать мне, как получить все контактные данные в одном запросе.Заранее спасибо:)

Ответы [ 2 ]

0 голосов
/ 15 декабря 2011

Если у вас есть rawContactId, вам не нужно многократный запрос.У вас может быть один запрос с Data.CONTENT_URI в качестве uri и с выбором в вашем rawContactId.

Вы должны зацикливаться с результирующим курсором, чтобы прочитать информацию.Чтобы узнать, в каком столбце вы должны увидеть для данной строки в таблице данных, вам нужно проверить MIMETYPE

РЕДАКТИРОВАТЬ

private interface DataQuery {
    public static final String[] PROJECTION = new String[] { Data._ID, Data.MIMETYPE, Data.DATA1, Data.DATA2, Data.DATA3, };

    public static final int COLUMN_ID = 0;
    public static final int COLUMN_MIMETYPE = 1;
    public static final int COLUMN_DATA1 = 2;
    public static final int COLUMN_DATA2 = 3;
    public static final int COLUMN_DATA3 = 4;
    public static final int COLUMN_PHONE_NUMBER = COLUMN_DATA1;
    public static final int COLUMN_PHONE_TYPE = COLUMN_DATA2;
    public static final int COLUMN_GIVEN_NAME = COLUMN_DATA2;
    public static final int COLUMN_FAMILY_NAME = COLUMN_DATA3;

    public static final String SELECTION = Data.RAW_CONTACT_ID + "=?";
}


final Cursor c = resolver.query(Data.CONTENT_URI, DataQuery.PROJECTION, DataQuery.SELECTION, new String[] { String.valueOf(rawContactId) }, null);

try {
    while (c.moveToNext()) {
        final long id = c.getLong(DataQuery.COLUMN_ID);
        final String mimeType = c.getString(DataQuery.COLUMN_MIMETYPE);
        uri = ContentUris.withAppendedId(Data.CONTENT_URI, id);

        if (mimeType.equals(StructuredName.CONTENT_ITEM_TYPE)) {
            final String oldLastName = c.getString(DataQuery.COLUMN_FAMILY_NAME);
            final String oldFirstName = c.getString(DataQuery.COLUMN_GIVEN_NAME);
            //store them where you need
        } else if (mimeType.equals(Phone.CONTENT_ITEM_TYPE)) {
            final int type = c.getInt(DataQuery.COLUMN_PHONE_TYPE);
            final String cellPhone = c.getString(DataQuery.COLUMN_PHONE_NUMBEIR);
            //store them where you need
            }
        }
    } // while
} finally {
    if (c!=null) c.close();
}

Пожалуйста, учтите, что я сделалНе проверяйте код: у меня нет компилятора здесь.Я надеюсь, что это будет полезно в любом случае

0 голосов
/ 14 декабря 2011

Данные - это общая таблица, которая может содержать любой вид контактных данных .

Тип данных, хранящихся в данной строке, определяется значением MIMETYPE строки, которое определяет значение общих столбцов DATA1 - DATA15.

Например, если тип данных - Phone.CONTENT_ITEM_TYPE, тогда в столбце DATA1 хранится номер телефона, но если тип данных - Email.CONTENT_ITEM_TYPE, тогда DATA1 сохраняет адрес электронной почты.Адаптеры синхронизации и приложения могут представлять свои собственные типы данных.

...