Невозможно добавить адрес электронной почты HOME, указанный в существующих контактах ANDROID. - PullRequest
2 голосов
/ 28 сентября 2011

У меня есть проблема, когда я делаю приложение "менеджер контактов" для Android. Я обработал создание и удаление контакта с именем и телефоном но когда я хочу добавить больше информации о домашней почте к существующим контактам, но не могу этого сделать.

вот мой код:

ArrayList ops = new ArrayList (); String selectName = ContactsContract.Data.CONTACT_ID + "=? AND" + ContactsContract.Data.MIMETYPE + "=?"; String [] NameArgs = new String [] {strId, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE};

        String selectPhone = ContactsContract.Data.CONTACT_ID + "= ? AND " + ContactsContract.Data.MIMETYPE + "= ? ";
        String[] phoneArgs = new String[]{strId, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE};

        String selectEmail = ContactsContract.Data.CONTACT_ID + "= ? AND " + ContactsContract.Data.MIMETYPE + "= ? ";
        String[] emailArgs = new String[]{strId, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE};

        String selectPostAdd = ContactsContract.Data.CONTACT_ID + "= ? AND " + ContactsContract.Data.MIMETYPE + "= ? AND " + ContactsContract.CommonDataKinds.StructuredPostal.TYPE + "= ? ";
        String[] postAddArgs = new String[]{strId, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE, String.valueOf(ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK)};

        ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
                .withSelection(selectName, NameArgs)
                .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, updContact_name.getText().toString())
                .build()); 
        ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
                .withSelection(selectPhone, phoneArgs)
                .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, updContact_phone.getText().toString())
                .build());

        ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
                .withSelection(selectEmail, emailArgs)
                .withValue(ContactsContract.Data.MIMETYPE, 
                    ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
                .withValue(ContactsContract.CommonDataKinds.Email.DATA, updContact_textMail.getText().toString())
                .withValue(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK)
                .build());          
        ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
                .withSelection(selectPostAdd, postAddArgs)
                .withValue(ContactsContract.Data.MIMETYPE, 
                        ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE)
                .withValue(ContactsContract.CommonDataKinds.StructuredPostal.DATA, updContact_textPostAdd.getText().toString())
                .withValue(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME)
                .build());
        getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);

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

кто-то имеет опыт об этом, пожалуйста, помогите мне! ТКС

извините за мою грамматику английского! В нем больше ошибок и неправильной грамматики. :(. Tks all

1 Ответ

0 голосов
/ 28 сентября 2011

Обновление не вставит поле, которое не существует, поэтому выполните следующие действия.

  1. Первый запрос для необработанного идентификатора контакта вашего контакта.

  2. использовать новый метод Вставка для вставки данных, которые не были вставлены в контакт ранее при создании (в противоположном случае newUpdate () будет работать нормально).

Кусок кода выглядит так

String[] params = new String[] {"Give your Contact"};// you need query and get this too.
String[] proj =  {ContactsContract.RawContacts._ID};
Cursor c = context.getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI,proj, 
                ContactsContract.Data._ID +"= ?", params, null);
long rawContactId = -1;

while(c.moveToNext()){
    rawContactId = c.getLong(0);
}
c.close();

После получения этих значений,

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

ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                .withValue(ContactsContract.Data.RAW_CONTACT_ID, rawContactId)
                .withValue(ContactsContract.Data.MIMETYPE,
                        ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
                        .withValue(ContactsContract.CommonDataKinds.Email.DATA, data.getEmail2Address())
                        .withValue(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_HOME)
                        .build());
...