Обновление контакта, приводящее к неправильным значениям для записи - PullRequest
0 голосов
/ 04 июня 2010

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

Вот мой метод, который обновляет URI контактов.

private void updateContact() {
    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
    ops.add(ContentProviderOperation.newUpdate(ContactsContract.RawContacts.CONTENT_URI)
            .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, name)
            .build());
    ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
            .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name)
            .withValue(ContactsContract.Data.MIMETYPE,
                        ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
            .build());
    ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
            .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phoneNumber)
            .withValue(ContactsContract.Data.MIMETYPE, 
                    ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
            .build());
    ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
            .withValue(ContactsContract.Data.MIMETYPE,
                            ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
            .withValue(ContactsContract.CommonDataKinds.Email.DATA, email)
            .build());

    try {
        getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
        // Display update
        Context ctx = getApplicationContext();
        CharSequence txt = "Contact Updated";
        int duration = Toast.LENGTH_SHORT;
        Toast toast = Toast.makeText(ctx, txt, duration);
        toast.show();

    } catch (Exception e) {
        // Display warning
        Context ctx = getApplicationContext();
        CharSequence txt = "Update Failed";
        int duration = Toast.LENGTH_SHORT;
        Toast toast = Toast.makeText(ctx, txt, duration);
        toast.show();

    }
}

Ответы [ 2 ]

7 голосов
/ 18 января 2011

см. Ссылку:

http://comments.gmane.org/gmane.comp.handhelds.android.devel/92848

"Вы не должны указывать тип MIME в операторе обновления - он не может быть обновлен."

"Ваш запрос говорит:" обновите все строк данных для этого контакта, установив для одного из полей значение "Иоанн", а для другого - "Авраам". Строки данных включают номера телефонов, электронные письма, фотографии, вы-имя-это. Вам нужно найти конкретную строку данных, которую вы хотите обновить, и затем использовать ее _id в выделении (или, чаще, в самом URI). "

"Структура данных для контактов основана на трех отдельных таблицах: Контакты, RawContacts и Данные. Контакт может иметь несколько RawContacts, которые могут иметь несколько строк данных. Каждая строка данных имеет тип MIME, который указывает, какой тип данных хранится в этой строке. Имя контакта хранится в строке с типом mime StructuredName.CONTENT_TYPE.

Итак, чтобы изменить имя контакта, сначала нужно найти строку данных, содержащую имя, а затем обновить эту строку данных. Об остальном позаботится провайдер (например, продвижение имени до уровня RawContact и затем Контакт). "

0 голосов
/ 18 января 2011

Также см.

http://www.eoeandroid.com/sdk/api/reference/android/provider/ContactsContract.Data.html

сначала должен получить dataId:

ArrayList ops = Lists.newArrayList (); ops.add (ContentProviderOperation.newUpdate (Data.CONTENT_URI) .withSelection (Data._ID + "=?", new String [] {String.valueOf (dataId)}) .withValue (Email.DATA, "somebody@android.com") .build ()); getContentResolver (). applyBatch (ContactsContract.AUTHORITY, ops);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...