Изменение контактной информации - PullRequest
18 голосов
/ 09 января 2012

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

Я выбираю контакт через систему. Назначение, например, так:

    startActivityForResult(new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI), PICK_CONTACT_REQUEST);

Возвращается URI, который был выбран из Contact (RawContact?) Иприходит в следующем виде: content://com.android.contacts/contacts/lookup/0r2-2A90214945/2.

Я могу получить все элементы Data (RawContact?), выполнив следующий код:

Cursor cursor = contentResolver.query(mContactUri, null, null, null, null);
try {
    if (cursor.moveToFirst()) {
        for(int i=0; i < cursor.getColumnCount(); i++) {
            String message = cursor.getColumnName(i);
            Log.v("", message);
        }
    }
} finally {
    cursor.close();
}

Сэто я должен быть в состоянии определить, есть ли у контакта CommonDataTypes.Email Data member:

cursor.getColumnIndex(CommonDataKinds.Email.CONTENT_ITEM_TYPE) != -1;

И затем выполнить одно из следующих действий для Insert или Update Данные :

ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();

ops.add(ContentProviderOperation.newInsert(mContactUri)
    .withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE)
    .withValue(Email.DISPLAY_NAME, "somebody@android.com")
    .withValue(Email.TYPE, Email.TYPE_HOME)
    .build());
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);

Но это дает мне исключение: java.lang.UnsupportedOperationException: URI: content://com.android.contacts/contacts/lookup/0r2-2A90314945/2, calling user:

Надеюсь, кто-нибудь увидит то, что я пропустил.

PS, я использую эти разрешения:

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />

1 Ответ

44 голосов
/ 10 января 2012

Пользователи Android должны обновить свою документацию . Это фактически помогло мне узнать меньше о том, что происходило, чем я мог бы догадаться. Он предполагает, что вы можете откатить Contact, который будет содержать много RawContacts, который будет содержать Data.

Это толкование совершенно неверно. Вместо этого данные ContactContracts представляют собой три обычные среднесуточные таблицы базы данных *:

Таблицы ContactContract

Таблица: Контакты

URI доступа: Contacts.CONTENT_URI

Первичный ключ **: Data._ID

Описание:

Эта таблица содержит информацию о контакте (когда он был добавлен, что это за значок пользователя, есть ли у него настраиваемая мелодия звонка).

Взаимосвязь: имеет отношение 1-ко-многим с таблицей RawContact.

Таблица: RawContacts

URI доступа: RawContacts.CONTENT_URI

Первичный ключ: Data._ID

Внешний ключ **: Data.CONTACT_ID

Описание:

Эта таблица содержит информацию о связанном наборе элементов данных. RawContact может содержать тип электронной почты, отображаемое имя электронной почты, номер телефона, отображаемое имя телефона и т. Д. RawContact может быть объединен с другими RawContacts для получения Contact, как его видит пользователь. Контакт может содержать только один RawContact.

Взаимосвязь: имеет отношение 1-ко-многим с таблицей Data.

Таблица: Данные

URI доступа: Data.CONTENT_URI

Первичный ключ: Data._ID

Внешний ключ: Data.RAW_CONTACT_ID

Описание:

Эта таблица содержит единственное поле информации. Адрес электронной почты, номер телефона, тип номера телефона (домашний / рабочий), псевдоним, отображаемое имя.

В ответ на вопрос

Я загрузил весь пример проекта в GitHub, чтобы другие могли видеть, как запрашивать, обновлять и вставлять записи, используя ContactContract.

Вы можете найти проект для загрузки здесь: https://github.com/gwoodhouse/ContactContractSample

Если вы просто хотите посмотреть на код Java, выполняющий запрос / обновление / вставку, вот файл класса: https://github.com/gwoodhouse/ContactContractSample/blob/master/ContactsIntegration/src/com/woodhouse/example/activity/ContactsIntegrationActivity.java

Надеюсь, это поможет!

* Не таблица, а ContentProvider

** не строго верно.

...