Обновление нескольких номеров телефонов в контакте

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

for(int j=0;j<allPhoneNumbersLength;j++)
{
PhoneInfo phoneInfo = (PhoneInfo) allPhoneNumbers.elementAt(j);
String phoneValue = phoneInfo.getValue();
int phoneType = phoneInfo.getIndex(); // phoneType = Phone.TYPE_HOME,  Phone.TYPE_WORK, etc
ContentProviderOperation.Builder builderPhone = ContentProviderOperation.newUpdate(Data.CONTENT_URI)
.withSelection(ContactsContract.Data.CONTACT_ID + "=?"+" AND "+ContactsContract.Data.MIMETYPE + "=?" + " AND "+Phone.TYPE+"=?",  new String[]{String.valueOf(contactID), Phone.CONTENT_ITEM_TYPE, String.valueOf(phoneType)});
if(phoneType == Phone.TYPE_HOME)
{
builderPhone.withValue(Phone.NUMBER, phoneValue)
.withValue(Phone.TYPE, Phone.TYPE_HOME);
}
else if(phoneType == Phone.TYPE_WORK)
{
builderPhone.withValue(Phone.NUMBER, phoneValue)
.withValue(Phone.TYPE, Phone.TYPE_WORK);
}
else if(phoneType == Phone.TYPE_FAX_HOME)
{
builderPhone.withValue(Phone.NUMBER, phoneValue)
.withValue(Phone.TYPE, Phone.TYPE_FAX_HOME);
}
op_list.add(builderPhone.build());

}
getContentResolver().applyBatch(ContactsContract.AUTHORITY, op_list);

Используя этот код, я пытаюсь обновить три номера, но обновляется только номер «TYPE_FAX_HOME», а два других номера удаляются из контакта.

Помогите мне, пожалуйста.


person Parveen    schedule 09.02.2013    source источник
comment
Во-первых, здесь вы используете else-if. Надеюсь, вы знаете, что будет введено только 1 утверждение среди ладдеров. Далее, какое значение содержит phoneType?   -  person RainMaker    schedule 09.02.2013
comment
Я отредактировал код.   -  person Parveen    schedule 09.02.2013


Ответы (4)


Из вашего кода я узнал, что вы используете одно и то же значение номера телефона для всех трех типов. Следовательно, при отображении Android будет отображать только 1 из них для контакта. Но если вы на самом деле редактируете контакт, вы увидите, что все 3 типа были заполнены одним и тем же номером.

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

person RainMaker    schedule 09.02.2013
comment
Да вы правы. Но один и тот же номер телефона заполняется одним и тем же типом три раза. Вы должны знать, почему? - person Parveen; 09.02.2013
comment
друг мой, ты везде использовал phoneValue. Очень сомневаюсь, что это изменится. Проверьте цикл FOR. Он имеет одно и то же phoneValue для всех типов телефонных номеров. - person RainMaker; 09.02.2013
comment
Я отредактировал код, phoneValue также изменился, а также phoneType. - person Parveen; 09.02.2013
comment
если вы получаете разные значения для каждой String phoneValue = phoneInfo.getValue();, тогда ваш код будет работать. - person RainMaker; 09.02.2013

Ух ты ... ! почему вы используете оператор «если»?! ваш код может быть таким:

for(int j=0;j<allPhoneNumbersLength;j++)
{
    PhoneInfo phoneInfo = (PhoneInfo) allPhoneNumbers.elementAt(j);
    int phoneType = phoneInfo.getIndex(); // phoneType = Phone.TYPE_HOME,  Phone.TYPE_WORK, etc
    ContentProviderOperation.Builder builderPhone = ContentProviderOperation.newUpdate(Data.CONTENT_URI)
        .withSelection(ContactsContract.Data.CONTACT_ID + "=?"+" AND "+ContactsContract.Data.MIMETYPE + "=?" + " AND "+Phone.TYPE+"=?",  new String[]{String.valueOf(contactID), Phone.CONTENT_ITEM_TYPE, String.valueOf(phoneType)});
    builderPhone.withValue(Phone.NUMBER, phoneValue)
        .withValue(Phone.TYPE, phoneType);
    op_list.add(builderPhone.build());
}
getContentResolver().applyBatch(ContactsContract.AUTHORITY, op_list);
person NeatAttack    schedule 09.02.2013
comment
Отличный улов. Я изменю код. Следует ли вам знать, почему последний номер телефона обновляется, а другие номера удаляются из контактов? - person Parveen; 09.02.2013

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

for(int j=0;j<allPhoneNumbersLength;j++)
{
    PhoneInfo phoneInfo = (PhoneInfo) allPhoneNumbers.elementAt(j);
    int phoneType = phoneInfo.getIndex(); // phoneType = Phone.TYPE_HOME,  Phone.TYPE_WORK, etc
    ContentProviderOperation.Builder builderPhone = ContentProviderOperation.newUpdate(Data.CONTENT_URI)
        .withSelection(ContactsContract.Data.CONTACT_ID + "=?"+" AND "+ContactsContract.Data.MIMETYPE + "=?" + " AND "+Phone.TYPE+"=?",  new String[]{String.valueOf(contactID), Phone.CONTENT_ITEM_TYPE, String.valueOf(phoneType)});
    builderPhone.withValue(Phone.NUMBER, phoneValue)
        .withValue(Phone.TYPE, phoneType);
    op_list.add(builderPhone.build());
    getContentResolver().applyBatch(ContactsContract.AUTHORITY, op_list);
}
person NeatAttack    schedule 09.02.2013

Проблема с эмулятором Android. Код отлично работает на реальном устройстве. Спасибо за вашу помощь.

person Parveen    schedule 12.02.2013